{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "3c835645-6b7e-42af-ad58-ba3e728635d1",
   "metadata": {},
   "source": [
    "# 决策树 随机森林"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3b80f545-17c9-4b97-89bb-87b57ca1c008",
   "metadata": {},
   "source": [
    "## 决策树"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "2084d908-81a2-494c-add0-ea442a0088bf",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "<>:3: SyntaxWarning: invalid escape sequence '\\w'\n",
      "<>:3: SyntaxWarning: invalid escape sequence '\\w'\n",
      "C:\\Users\\86147\\AppData\\Local\\Temp\\ipykernel_30184\\2614869567.py:3: SyntaxWarning: invalid escape sequence '\\w'\n",
      "  credit_df = pd.read_csv(\"D:\\work\\homework/credit.csv\")\n"
     ]
    }
   ],
   "source": [
    "import numpy as py\n",
    "import pandas as pd\n",
    "credit_df = pd.read_csv(\"D:\\work\\homework/credit.csv\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "a094dc02-3d7f-431c-8343-37f5e97ba445",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>checking</th>\n",
       "      <th>duration</th>\n",
       "      <th>history</th>\n",
       "      <th>purpose</th>\n",
       "      <th>amount</th>\n",
       "      <th>savings</th>\n",
       "      <th>employed</th>\n",
       "      <th>installp</th>\n",
       "      <th>marital</th>\n",
       "      <th>coapp</th>\n",
       "      <th>...</th>\n",
       "      <th>property</th>\n",
       "      <th>age</th>\n",
       "      <th>other</th>\n",
       "      <th>housing</th>\n",
       "      <th>existcr</th>\n",
       "      <th>job</th>\n",
       "      <th>depends</th>\n",
       "      <th>telephon</th>\n",
       "      <th>foreign</th>\n",
       "      <th>good_bad</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>0 rows × 21 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "Empty DataFrame\n",
       "Columns: [checking, duration, history, purpose, amount, savings, employed, installp, marital, coapp, resident, property, age, other, housing, existcr, job, depends, telephon, foreign, good_bad]\n",
       "Index: []\n",
       "\n",
       "[0 rows x 21 columns]"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "credit_df[credit_df.duplicated()]  #检查数据是否有重复"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "2ce6d3f2-e52d-4ed6-8e84-6b98a3629e1b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "checking    0\n",
       "duration    0\n",
       "history     0\n",
       "purpose     0\n",
       "amount      0\n",
       "savings     0\n",
       "employed    0\n",
       "installp    0\n",
       "marital     0\n",
       "coapp       0\n",
       "resident    0\n",
       "property    0\n",
       "age         0\n",
       "other       0\n",
       "housing     0\n",
       "existcr     0\n",
       "job         0\n",
       "depends     0\n",
       "telephon    0\n",
       "foreign     0\n",
       "good_bad    0\n",
       "dtype: int64"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "credit_df.isnull().sum()  #检查数据是否有空值"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "94f1aff3-c775-4569-8f23-0b5d5b7e8352",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>checking</th>\n",
       "      <th>duration</th>\n",
       "      <th>history</th>\n",
       "      <th>amount</th>\n",
       "      <th>savings</th>\n",
       "      <th>employed</th>\n",
       "      <th>installp</th>\n",
       "      <th>marital</th>\n",
       "      <th>coapp</th>\n",
       "      <th>resident</th>\n",
       "      <th>property</th>\n",
       "      <th>age</th>\n",
       "      <th>other</th>\n",
       "      <th>housing</th>\n",
       "      <th>existcr</th>\n",
       "      <th>job</th>\n",
       "      <th>depends</th>\n",
       "      <th>telephon</th>\n",
       "      <th>foreign</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>1000.000000</td>\n",
       "      <td>1000.000000</td>\n",
       "      <td>1000.00000</td>\n",
       "      <td>1000.000000</td>\n",
       "      <td>1000.000000</td>\n",
       "      <td>1000.000000</td>\n",
       "      <td>1000.000000</td>\n",
       "      <td>1000.00000</td>\n",
       "      <td>1000.000000</td>\n",
       "      <td>1000.000000</td>\n",
       "      <td>1000.000000</td>\n",
       "      <td>1000.000000</td>\n",
       "      <td>1000.000000</td>\n",
       "      <td>1000.000000</td>\n",
       "      <td>1000.000000</td>\n",
       "      <td>1000.000000</td>\n",
       "      <td>1000.000000</td>\n",
       "      <td>1000.000000</td>\n",
       "      <td>1000.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>2.577000</td>\n",
       "      <td>20.903000</td>\n",
       "      <td>2.54500</td>\n",
       "      <td>3271.258000</td>\n",
       "      <td>2.105000</td>\n",
       "      <td>3.384000</td>\n",
       "      <td>2.973000</td>\n",
       "      <td>2.68200</td>\n",
       "      <td>1.145000</td>\n",
       "      <td>2.845000</td>\n",
       "      <td>2.358000</td>\n",
       "      <td>35.546000</td>\n",
       "      <td>2.675000</td>\n",
       "      <td>1.929000</td>\n",
       "      <td>1.407000</td>\n",
       "      <td>2.904000</td>\n",
       "      <td>1.155000</td>\n",
       "      <td>1.404000</td>\n",
       "      <td>1.037000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>1.257638</td>\n",
       "      <td>12.058814</td>\n",
       "      <td>1.08312</td>\n",
       "      <td>2822.736876</td>\n",
       "      <td>1.580023</td>\n",
       "      <td>1.208306</td>\n",
       "      <td>1.118715</td>\n",
       "      <td>0.70808</td>\n",
       "      <td>0.477706</td>\n",
       "      <td>1.103718</td>\n",
       "      <td>1.050209</td>\n",
       "      <td>11.375469</td>\n",
       "      <td>0.705601</td>\n",
       "      <td>0.531264</td>\n",
       "      <td>0.577654</td>\n",
       "      <td>0.653614</td>\n",
       "      <td>0.362086</td>\n",
       "      <td>0.490943</td>\n",
       "      <td>0.188856</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>1.000000</td>\n",
       "      <td>4.000000</td>\n",
       "      <td>0.00000</td>\n",
       "      <td>250.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.00000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>19.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>1.000000</td>\n",
       "      <td>12.000000</td>\n",
       "      <td>2.00000</td>\n",
       "      <td>1365.500000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>3.000000</td>\n",
       "      <td>2.000000</td>\n",
       "      <td>2.00000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>2.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>27.000000</td>\n",
       "      <td>3.000000</td>\n",
       "      <td>2.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>3.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>2.000000</td>\n",
       "      <td>18.000000</td>\n",
       "      <td>2.00000</td>\n",
       "      <td>2319.500000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>3.000000</td>\n",
       "      <td>3.000000</td>\n",
       "      <td>3.00000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>3.000000</td>\n",
       "      <td>2.000000</td>\n",
       "      <td>33.000000</td>\n",
       "      <td>3.000000</td>\n",
       "      <td>2.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>3.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>4.000000</td>\n",
       "      <td>24.000000</td>\n",
       "      <td>4.00000</td>\n",
       "      <td>3972.250000</td>\n",
       "      <td>3.000000</td>\n",
       "      <td>5.000000</td>\n",
       "      <td>4.000000</td>\n",
       "      <td>3.00000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>4.000000</td>\n",
       "      <td>3.000000</td>\n",
       "      <td>42.000000</td>\n",
       "      <td>3.000000</td>\n",
       "      <td>2.000000</td>\n",
       "      <td>2.000000</td>\n",
       "      <td>3.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>2.000000</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>4.000000</td>\n",
       "      <td>72.000000</td>\n",
       "      <td>4.00000</td>\n",
       "      <td>18424.000000</td>\n",
       "      <td>5.000000</td>\n",
       "      <td>5.000000</td>\n",
       "      <td>4.000000</td>\n",
       "      <td>4.00000</td>\n",
       "      <td>3.000000</td>\n",
       "      <td>4.000000</td>\n",
       "      <td>4.000000</td>\n",
       "      <td>75.000000</td>\n",
       "      <td>3.000000</td>\n",
       "      <td>3.000000</td>\n",
       "      <td>4.000000</td>\n",
       "      <td>4.000000</td>\n",
       "      <td>2.000000</td>\n",
       "      <td>2.000000</td>\n",
       "      <td>2.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          checking     duration     history        amount      savings  \\\n",
       "count  1000.000000  1000.000000  1000.00000   1000.000000  1000.000000   \n",
       "mean      2.577000    20.903000     2.54500   3271.258000     2.105000   \n",
       "std       1.257638    12.058814     1.08312   2822.736876     1.580023   \n",
       "min       1.000000     4.000000     0.00000    250.000000     1.000000   \n",
       "25%       1.000000    12.000000     2.00000   1365.500000     1.000000   \n",
       "50%       2.000000    18.000000     2.00000   2319.500000     1.000000   \n",
       "75%       4.000000    24.000000     4.00000   3972.250000     3.000000   \n",
       "max       4.000000    72.000000     4.00000  18424.000000     5.000000   \n",
       "\n",
       "          employed     installp     marital        coapp     resident  \\\n",
       "count  1000.000000  1000.000000  1000.00000  1000.000000  1000.000000   \n",
       "mean      3.384000     2.973000     2.68200     1.145000     2.845000   \n",
       "std       1.208306     1.118715     0.70808     0.477706     1.103718   \n",
       "min       1.000000     1.000000     1.00000     1.000000     1.000000   \n",
       "25%       3.000000     2.000000     2.00000     1.000000     2.000000   \n",
       "50%       3.000000     3.000000     3.00000     1.000000     3.000000   \n",
       "75%       5.000000     4.000000     3.00000     1.000000     4.000000   \n",
       "max       5.000000     4.000000     4.00000     3.000000     4.000000   \n",
       "\n",
       "          property          age        other      housing      existcr  \\\n",
       "count  1000.000000  1000.000000  1000.000000  1000.000000  1000.000000   \n",
       "mean      2.358000    35.546000     2.675000     1.929000     1.407000   \n",
       "std       1.050209    11.375469     0.705601     0.531264     0.577654   \n",
       "min       1.000000    19.000000     1.000000     1.000000     1.000000   \n",
       "25%       1.000000    27.000000     3.000000     2.000000     1.000000   \n",
       "50%       2.000000    33.000000     3.000000     2.000000     1.000000   \n",
       "75%       3.000000    42.000000     3.000000     2.000000     2.000000   \n",
       "max       4.000000    75.000000     3.000000     3.000000     4.000000   \n",
       "\n",
       "               job      depends     telephon      foreign  \n",
       "count  1000.000000  1000.000000  1000.000000  1000.000000  \n",
       "mean      2.904000     1.155000     1.404000     1.037000  \n",
       "std       0.653614     0.362086     0.490943     0.188856  \n",
       "min       1.000000     1.000000     1.000000     1.000000  \n",
       "25%       3.000000     1.000000     1.000000     1.000000  \n",
       "50%       3.000000     1.000000     1.000000     1.000000  \n",
       "75%       3.000000     1.000000     2.000000     1.000000  \n",
       "max       4.000000     2.000000     2.000000     2.000000  "
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "credit_df.describe()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "4810dd8e-8f01-4383-bacd-4fc840bb860c",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 1000 entries, 0 to 999\n",
      "Data columns (total 21 columns):\n",
      " #   Column    Non-Null Count  Dtype \n",
      "---  ------    --------------  ----- \n",
      " 0   checking  1000 non-null   int64 \n",
      " 1   duration  1000 non-null   int64 \n",
      " 2   history   1000 non-null   int64 \n",
      " 3   purpose   1000 non-null   object\n",
      " 4   amount    1000 non-null   int64 \n",
      " 5   savings   1000 non-null   int64 \n",
      " 6   employed  1000 non-null   int64 \n",
      " 7   installp  1000 non-null   int64 \n",
      " 8   marital   1000 non-null   int64 \n",
      " 9   coapp     1000 non-null   int64 \n",
      " 10  resident  1000 non-null   int64 \n",
      " 11  property  1000 non-null   int64 \n",
      " 12  age       1000 non-null   int64 \n",
      " 13  other     1000 non-null   int64 \n",
      " 14  housing   1000 non-null   int64 \n",
      " 15  existcr   1000 non-null   int64 \n",
      " 16  job       1000 non-null   int64 \n",
      " 17  depends   1000 non-null   int64 \n",
      " 18  telephon  1000 non-null   int64 \n",
      " 19  foreign   1000 non-null   int64 \n",
      " 20  good_bad  1000 non-null   object\n",
      "dtypes: int64(19), object(2)\n",
      "memory usage: 164.2+ KB\n"
     ]
    }
   ],
   "source": [
    "credit_df.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "736a456a-0279-4497-b83b-10df78bc40f0",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 把类别型变量进行独热编码(1->N)\n",
    "checking = pd.get_dummies(credit_df.checking,prefix='checking')\n",
    "history = pd.get_dummies(credit_df.history,prefix='history')\n",
    "purpose = pd.get_dummies(credit_df.purpose,prefix='purpose')\n",
    "savings = pd.get_dummies(credit_df.savings,prefix='savings')\n",
    "employed = pd.get_dummies(credit_df.employed,prefix='employed')\n",
    "installp = pd.get_dummies(credit_df.installp,prefix='installp')\n",
    "marital = pd.get_dummies(credit_df.marital,prefix='marital')\n",
    "coapp = pd.get_dummies(credit_df.coapp,prefix='coapp')\n",
    "installp = pd.get_dummies(credit_df.installp,prefix='installp')\n",
    "resident = pd.get_dummies(credit_df.resident,prefix='resident')\n",
    "property = pd.get_dummies(credit_df.property,prefix='property')\n",
    "housing = pd.get_dummies(credit_df.housing,prefix='housing')\n",
    "existcr = pd.get_dummies(credit_df.existcr,prefix='existcr')\n",
    "job = pd.get_dummies(credit_df.job,prefix='job')\n",
    "depends = pd.get_dummies(credit_df.depends,prefix='depends')\n",
    "telephon = pd.get_dummies(credit_df.telephon,prefix='telephon')\n",
    "foreign = pd.get_dummies(credit_df.foreign,prefix='foreign')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "9892e523-9fe2-4a7d-b50a-bd30e3540ced",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>duration</th>\n",
       "      <th>amount</th>\n",
       "      <th>age</th>\n",
       "      <th>checking_1</th>\n",
       "      <th>checking_2</th>\n",
       "      <th>checking_3</th>\n",
       "      <th>checking_4</th>\n",
       "      <th>history_0</th>\n",
       "      <th>history_1</th>\n",
       "      <th>history_2</th>\n",
       "      <th>...</th>\n",
       "      <th>job_1</th>\n",
       "      <th>job_2</th>\n",
       "      <th>job_3</th>\n",
       "      <th>job_4</th>\n",
       "      <th>depends_1</th>\n",
       "      <th>depends_2</th>\n",
       "      <th>telephon_1</th>\n",
       "      <th>telephon_2</th>\n",
       "      <th>foreign_1</th>\n",
       "      <th>foreign_2</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>6</td>\n",
       "      <td>1169</td>\n",
       "      <td>67</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>...</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>48</td>\n",
       "      <td>5951</td>\n",
       "      <td>22</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>...</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>12</td>\n",
       "      <td>2096</td>\n",
       "      <td>49</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>...</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>42</td>\n",
       "      <td>7882</td>\n",
       "      <td>45</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>...</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>24</td>\n",
       "      <td>4870</td>\n",
       "      <td>53</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>...</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>995</th>\n",
       "      <td>12</td>\n",
       "      <td>1736</td>\n",
       "      <td>31</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>...</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>996</th>\n",
       "      <td>30</td>\n",
       "      <td>3857</td>\n",
       "      <td>40</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>...</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>997</th>\n",
       "      <td>12</td>\n",
       "      <td>804</td>\n",
       "      <td>38</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>...</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>998</th>\n",
       "      <td>45</td>\n",
       "      <td>1845</td>\n",
       "      <td>23</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>...</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>999</th>\n",
       "      <td>45</td>\n",
       "      <td>4576</td>\n",
       "      <td>27</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>...</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>1000 rows × 72 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "     duration  amount  age  checking_1  checking_2  checking_3  checking_4  \\\n",
       "0           6    1169   67        True       False       False       False   \n",
       "1          48    5951   22       False        True       False       False   \n",
       "2          12    2096   49       False       False       False        True   \n",
       "3          42    7882   45        True       False       False       False   \n",
       "4          24    4870   53        True       False       False       False   \n",
       "..        ...     ...  ...         ...         ...         ...         ...   \n",
       "995        12    1736   31       False       False       False        True   \n",
       "996        30    3857   40        True       False       False       False   \n",
       "997        12     804   38       False       False       False        True   \n",
       "998        45    1845   23        True       False       False       False   \n",
       "999        45    4576   27       False        True       False       False   \n",
       "\n",
       "     history_0  history_1  history_2  ...  job_1  job_2  job_3  job_4  \\\n",
       "0        False      False      False  ...  False  False   True  False   \n",
       "1        False      False       True  ...  False  False   True  False   \n",
       "2        False      False      False  ...  False   True  False  False   \n",
       "3        False      False       True  ...  False  False   True  False   \n",
       "4        False      False      False  ...  False  False   True  False   \n",
       "..         ...        ...        ...  ...    ...    ...    ...    ...   \n",
       "995      False      False       True  ...  False   True  False  False   \n",
       "996      False      False       True  ...  False  False  False   True   \n",
       "997      False      False       True  ...  False  False   True  False   \n",
       "998      False      False       True  ...  False  False   True  False   \n",
       "999      False      False      False  ...  False  False   True  False   \n",
       "\n",
       "     depends_1  depends_2  telephon_1  telephon_2  foreign_1  foreign_2  \n",
       "0         True      False       False        True       True      False  \n",
       "1         True      False        True       False       True      False  \n",
       "2        False       True        True       False       True      False  \n",
       "3        False       True        True       False       True      False  \n",
       "4        False       True        True       False       True      False  \n",
       "..         ...        ...         ...         ...        ...        ...  \n",
       "995       True      False        True       False       True      False  \n",
       "996       True      False       False        True       True      False  \n",
       "997       True      False        True       False       True      False  \n",
       "998       True      False       False        True       True      False  \n",
       "999       True      False        True       False       True      False  \n",
       "\n",
       "[1000 rows x 72 columns]"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 利用concat()函数把转换后的数据对象全部合并在一起变成新的数据对象，命名为trainData_X\n",
    "trainData_X = pd.concat([credit_df.duration, credit_df.amount, credit_df.age, checking, history, purpose, savings, employed, installp, marital, coapp, installp, resident, property, housing, existcr, job, depends, telephon, foreign], axis=1)\n",
    "trainData_X\n",
    "# 72 columns"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "e04dbbe4-15f6-4ec8-8655-6b49033d7e61",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "target\n",
       "0    700\n",
       "1    300\n",
       "Name: count, dtype: int64"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 构造目标变量y的数据对象\n",
    "# 当前的目标变量good_bad的取值是'good'和'bad'，一般我们习惯把二分类的类别值编码为0和1，1一般表示类别比较少的那一类，他们往往是我们感兴趣的\n",
    "credit_df['target'] = 0\n",
    "credit_df.loc[(credit_df.good_bad == 'bad'), 'target'] = 1\n",
    "\n",
    "trainData_y = credit_df['target'] \n",
    "trainData_y.value_counts()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "da150cfb-4c90-4fc8-8cc3-dcdbcc9d378e",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 拆分训练集和测试集\n",
    "from sklearn.model_selection import train_test_split\n",
    "X_train, X_test, y_train, y_test = train_test_split(trainData_X, trainData_y, test_size=0.3, random_state=2048)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "7f277cc7-b2de-4533-a956-6a5d2e6b45d3",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>duration</th>\n",
       "      <th>amount</th>\n",
       "      <th>age</th>\n",
       "      <th>checking_1</th>\n",
       "      <th>checking_2</th>\n",
       "      <th>checking_3</th>\n",
       "      <th>checking_4</th>\n",
       "      <th>history_0</th>\n",
       "      <th>history_1</th>\n",
       "      <th>history_2</th>\n",
       "      <th>...</th>\n",
       "      <th>job_1</th>\n",
       "      <th>job_2</th>\n",
       "      <th>job_3</th>\n",
       "      <th>job_4</th>\n",
       "      <th>depends_1</th>\n",
       "      <th>depends_2</th>\n",
       "      <th>telephon_1</th>\n",
       "      <th>telephon_2</th>\n",
       "      <th>foreign_1</th>\n",
       "      <th>foreign_2</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>197</th>\n",
       "      <td>12</td>\n",
       "      <td>951</td>\n",
       "      <td>27</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>...</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>250</th>\n",
       "      <td>6</td>\n",
       "      <td>666</td>\n",
       "      <td>39</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>...</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>420</th>\n",
       "      <td>15</td>\n",
       "      <td>3186</td>\n",
       "      <td>20</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>...</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>202</th>\n",
       "      <td>27</td>\n",
       "      <td>5117</td>\n",
       "      <td>26</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>...</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>623</th>\n",
       "      <td>12</td>\n",
       "      <td>1858</td>\n",
       "      <td>22</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>...</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>231</th>\n",
       "      <td>9</td>\n",
       "      <td>2507</td>\n",
       "      <td>51</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>...</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>258</th>\n",
       "      <td>15</td>\n",
       "      <td>3812</td>\n",
       "      <td>23</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>...</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>782</th>\n",
       "      <td>12</td>\n",
       "      <td>1410</td>\n",
       "      <td>31</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>...</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>613</th>\n",
       "      <td>24</td>\n",
       "      <td>3632</td>\n",
       "      <td>22</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>...</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>409</th>\n",
       "      <td>12</td>\n",
       "      <td>939</td>\n",
       "      <td>28</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>...</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>300 rows × 72 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "     duration  amount  age  checking_1  checking_2  checking_3  checking_4  \\\n",
       "197        12     951   27       False        True       False       False   \n",
       "250         6     666   39        True       False       False       False   \n",
       "420        15    3186   20       False       False       False        True   \n",
       "202        27    5117   26       False       False       False        True   \n",
       "623        12    1858   22        True       False       False       False   \n",
       "..        ...     ...  ...         ...         ...         ...         ...   \n",
       "231         9    2507   51       False       False       False        True   \n",
       "258        15    3812   23       False       False       False        True   \n",
       "782        12    1410   31       False        True       False       False   \n",
       "613        24    3632   22        True       False       False       False   \n",
       "409        12     939   28       False       False        True       False   \n",
       "\n",
       "     history_0  history_1  history_2  ...  job_1  job_2  job_3  job_4  \\\n",
       "197      False      False       True  ...  False  False   True  False   \n",
       "250      False      False      False  ...  False   True  False  False   \n",
       "420      False      False       True  ...  False  False   True  False   \n",
       "202      False      False      False  ...  False  False   True  False   \n",
       "623      False      False       True  ...  False  False   True  False   \n",
       "..         ...        ...        ...  ...    ...    ...    ...    ...   \n",
       "231      False      False       True  ...  False   True  False  False   \n",
       "258      False      False       True  ...  False  False   True  False   \n",
       "782       True      False      False  ...  False   True  False  False   \n",
       "613      False       True      False  ...  False  False   True  False   \n",
       "409      False      False      False  ...  False  False   True  False   \n",
       "\n",
       "     depends_1  depends_2  telephon_1  telephon_2  foreign_1  foreign_2  \n",
       "197       True      False        True       False       True      False  \n",
       "250       True      False       False        True       True      False  \n",
       "420       True      False        True       False       True      False  \n",
       "202       True      False        True       False       True      False  \n",
       "623       True      False        True       False       True      False  \n",
       "..         ...        ...         ...         ...        ...        ...  \n",
       "231       True      False        True       False       True      False  \n",
       "258       True      False       False        True       True      False  \n",
       "782       True      False       False        True       True      False  \n",
       "613       True      False        True       False      False       True  \n",
       "409       True      False       False        True       True      False  \n",
       "\n",
       "[300 rows x 72 columns]"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_test"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "b57e0268-348f-4ee4-91b6-6298f2981710",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "target\n",
       "0    199\n",
       "1    101\n",
       "Name: count, dtype: int64"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_test.value_counts()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "387ffa83-3242-4156-8983-d8b7dae8af7e",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style>#sk-container-id-1 {\n",
       "  /* Definition of color scheme common for light and dark mode */\n",
       "  --sklearn-color-text: black;\n",
       "  --sklearn-color-line: gray;\n",
       "  /* Definition of color scheme for unfitted estimators */\n",
       "  --sklearn-color-unfitted-level-0: #fff5e6;\n",
       "  --sklearn-color-unfitted-level-1: #f6e4d2;\n",
       "  --sklearn-color-unfitted-level-2: #ffe0b3;\n",
       "  --sklearn-color-unfitted-level-3: chocolate;\n",
       "  /* Definition of color scheme for fitted estimators */\n",
       "  --sklearn-color-fitted-level-0: #f0f8ff;\n",
       "  --sklearn-color-fitted-level-1: #d4ebff;\n",
       "  --sklearn-color-fitted-level-2: #b3dbfd;\n",
       "  --sklearn-color-fitted-level-3: cornflowerblue;\n",
       "\n",
       "  /* Specific color for light theme */\n",
       "  --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n",
       "  --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-icon: #696969;\n",
       "\n",
       "  @media (prefers-color-scheme: dark) {\n",
       "    /* Redefinition of color scheme for dark theme */\n",
       "    --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n",
       "    --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-icon: #878787;\n",
       "  }\n",
       "}\n",
       "\n",
       "#sk-container-id-1 {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 pre {\n",
       "  padding: 0;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 input.sk-hidden--visually {\n",
       "  border: 0;\n",
       "  clip: rect(1px 1px 1px 1px);\n",
       "  clip: rect(1px, 1px, 1px, 1px);\n",
       "  height: 1px;\n",
       "  margin: -1px;\n",
       "  overflow: hidden;\n",
       "  padding: 0;\n",
       "  position: absolute;\n",
       "  width: 1px;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-dashed-wrapped {\n",
       "  border: 1px dashed var(--sklearn-color-line);\n",
       "  margin: 0 0.4em 0.5em 0.4em;\n",
       "  box-sizing: border-box;\n",
       "  padding-bottom: 0.4em;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-container {\n",
       "  /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
       "     but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
       "     so we also need the `!important` here to be able to override the\n",
       "     default hidden behavior on the sphinx rendered scikit-learn.org.\n",
       "     See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n",
       "  display: inline-block !important;\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-text-repr-fallback {\n",
       "  display: none;\n",
       "}\n",
       "\n",
       "div.sk-parallel-item,\n",
       "div.sk-serial,\n",
       "div.sk-item {\n",
       "  /* draw centered vertical line to link estimators */\n",
       "  background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n",
       "  background-size: 2px 100%;\n",
       "  background-repeat: no-repeat;\n",
       "  background-position: center center;\n",
       "}\n",
       "\n",
       "/* Parallel-specific style estimator block */\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel-item::after {\n",
       "  content: \"\";\n",
       "  width: 100%;\n",
       "  border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
       "  flex-grow: 1;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel {\n",
       "  display: flex;\n",
       "  align-items: stretch;\n",
       "  justify-content: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel-item {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel-item:first-child::after {\n",
       "  align-self: flex-end;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel-item:last-child::after {\n",
       "  align-self: flex-start;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel-item:only-child::after {\n",
       "  width: 0;\n",
       "}\n",
       "\n",
       "/* Serial-specific style estimator block */\n",
       "\n",
       "#sk-container-id-1 div.sk-serial {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "  align-items: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  padding-right: 1em;\n",
       "  padding-left: 1em;\n",
       "}\n",
       "\n",
       "\n",
       "/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n",
       "clickable and can be expanded/collapsed.\n",
       "- Pipeline and ColumnTransformer use this feature and define the default style\n",
       "- Estimators will overwrite some part of the style using the `sk-estimator` class\n",
       "*/\n",
       "\n",
       "/* Pipeline and ColumnTransformer style (default) */\n",
       "\n",
       "#sk-container-id-1 div.sk-toggleable {\n",
       "  /* Default theme specific background. It is overwritten whether we have a\n",
       "  specific estimator or a Pipeline/ColumnTransformer */\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "/* Toggleable label */\n",
       "#sk-container-id-1 label.sk-toggleable__label {\n",
       "  cursor: pointer;\n",
       "  display: block;\n",
       "  width: 100%;\n",
       "  margin-bottom: 0;\n",
       "  padding: 0.5em;\n",
       "  box-sizing: border-box;\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 label.sk-toggleable__label-arrow:before {\n",
       "  /* Arrow on the left of the label */\n",
       "  content: \"▸\";\n",
       "  float: left;\n",
       "  margin-right: 0.25em;\n",
       "  color: var(--sklearn-color-icon);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 label.sk-toggleable__label-arrow:hover:before {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "/* Toggleable content - dropdown */\n",
       "\n",
       "#sk-container-id-1 div.sk-toggleable__content {\n",
       "  max-height: 0;\n",
       "  max-width: 0;\n",
       "  overflow: hidden;\n",
       "  text-align: left;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-toggleable__content.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-toggleable__content pre {\n",
       "  margin: 0.2em;\n",
       "  border-radius: 0.25em;\n",
       "  color: var(--sklearn-color-text);\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-toggleable__content.fitted pre {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n",
       "  /* Expand drop-down */\n",
       "  max-height: 200px;\n",
       "  max-width: 100%;\n",
       "  overflow: auto;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
       "  content: \"▾\";\n",
       "}\n",
       "\n",
       "/* Pipeline/ColumnTransformer-specific style */\n",
       "\n",
       "#sk-container-id-1 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator-specific style */\n",
       "\n",
       "/* Colorize estimator box */\n",
       "#sk-container-id-1 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-label label.sk-toggleable__label,\n",
       "#sk-container-id-1 div.sk-label label {\n",
       "  /* The background is the default theme color */\n",
       "  color: var(--sklearn-color-text-on-default-background);\n",
       "}\n",
       "\n",
       "/* On hover, darken the color of the background */\n",
       "#sk-container-id-1 div.sk-label:hover label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "/* Label box, darken color on hover, fitted */\n",
       "#sk-container-id-1 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator label */\n",
       "\n",
       "#sk-container-id-1 div.sk-label label {\n",
       "  font-family: monospace;\n",
       "  font-weight: bold;\n",
       "  display: inline-block;\n",
       "  line-height: 1.2em;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-label-container {\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "/* Estimator-specific */\n",
       "#sk-container-id-1 div.sk-estimator {\n",
       "  font-family: monospace;\n",
       "  border: 1px dotted var(--sklearn-color-border-box);\n",
       "  border-radius: 0.25em;\n",
       "  box-sizing: border-box;\n",
       "  margin-bottom: 0.5em;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-estimator.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "/* on hover */\n",
       "#sk-container-id-1 div.sk-estimator:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-estimator.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Specification for estimator info (e.g. \"i\" and \"?\") */\n",
       "\n",
       "/* Common style for \"i\" and \"?\" */\n",
       "\n",
       ".sk-estimator-doc-link,\n",
       "a:link.sk-estimator-doc-link,\n",
       "a:visited.sk-estimator-doc-link {\n",
       "  float: right;\n",
       "  font-size: smaller;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1em;\n",
       "  height: 1em;\n",
       "  width: 1em;\n",
       "  text-decoration: none !important;\n",
       "  margin-left: 1ex;\n",
       "  /* unfitted */\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted,\n",
       "a:link.sk-estimator-doc-link.fitted,\n",
       "a:visited.sk-estimator-doc-link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "div.sk-estimator:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "/* Span, style for the box shown on hovering the info icon */\n",
       ".sk-estimator-doc-link span {\n",
       "  display: none;\n",
       "  z-index: 9999;\n",
       "  position: relative;\n",
       "  font-weight: normal;\n",
       "  right: .2ex;\n",
       "  padding: .5ex;\n",
       "  margin: .5ex;\n",
       "  width: min-content;\n",
       "  min-width: 20ex;\n",
       "  max-width: 50ex;\n",
       "  color: var(--sklearn-color-text);\n",
       "  box-shadow: 2pt 2pt 4pt #999;\n",
       "  /* unfitted */\n",
       "  background: var(--sklearn-color-unfitted-level-0);\n",
       "  border: .5pt solid var(--sklearn-color-unfitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted span {\n",
       "  /* fitted */\n",
       "  background: var(--sklearn-color-fitted-level-0);\n",
       "  border: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link:hover span {\n",
       "  display: block;\n",
       "}\n",
       "\n",
       "/* \"?\"-specific style due to the `<a>` HTML tag */\n",
       "\n",
       "#sk-container-id-1 a.estimator_doc_link {\n",
       "  float: right;\n",
       "  font-size: 1rem;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1rem;\n",
       "  height: 1rem;\n",
       "  width: 1rem;\n",
       "  text-decoration: none;\n",
       "  /* unfitted */\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 a.estimator_doc_link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "#sk-container-id-1 a.estimator_doc_link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 a.estimator_doc_link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "</style><div id=\"sk-container-id-1\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>DecisionTreeClassifier(max_depth=10)</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-1\" type=\"checkbox\" checked><label for=\"sk-estimator-id-1\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\">&nbsp;&nbsp;DecisionTreeClassifier<a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.4/modules/generated/sklearn.tree.DecisionTreeClassifier.html\">?<span>Documentation for DecisionTreeClassifier</span></a><span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></label><div class=\"sk-toggleable__content fitted\"><pre>DecisionTreeClassifier(max_depth=10)</pre></div> </div></div></div></div>"
      ],
      "text/plain": [
       "DecisionTreeClassifier(max_depth=10)"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.tree import DecisionTreeClassifier\n",
    "\n",
    "dtree = DecisionTreeClassifier(max_depth=10)\n",
    "dtree.fit(X_train,y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "dd958cb1-c35a-4b88-a6ba-2a99ed39dba7",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0.11001877, 0.16072213, 0.10953089, 0.        , 0.00724386,\n",
       "       0.        , 0.12837154, 0.02479451, 0.04994395, 0.011716  ,\n",
       "       0.00436754, 0.01235984, 0.        , 0.01640178, 0.00660248,\n",
       "       0.        , 0.        , 0.00651948, 0.00177266, 0.        ,\n",
       "       0.02925399, 0.        , 0.04946573, 0.02740458, 0.00705467,\n",
       "       0.        , 0.        , 0.02868117, 0.        , 0.00792297,\n",
       "       0.        , 0.01165493, 0.        , 0.        , 0.00871527,\n",
       "       0.        , 0.        , 0.        , 0.01510577, 0.        ,\n",
       "       0.01730297, 0.01044812, 0.01523301, 0.        , 0.        ,\n",
       "       0.01138645, 0.00930225, 0.00916801, 0.        , 0.        ,\n",
       "       0.        , 0.        , 0.02097184, 0.03284741, 0.        ,\n",
       "       0.        , 0.        , 0.00633838, 0.        , 0.00578104,\n",
       "       0.        , 0.        , 0.        , 0.        , 0.        ,\n",
       "       0.00151019, 0.00380303, 0.        , 0.0050707 , 0.00887373,\n",
       "       0.00633838, 0.        ])"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dtree.feature_importances_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "039a4647-fe76-434e-865c-1a6d72be6220",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>feature</th>\n",
       "      <th>importance</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>amount</td>\n",
       "      <td>0.160722</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>checking_4</td>\n",
       "      <td>0.128372</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>duration</td>\n",
       "      <td>0.110019</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>age</td>\n",
       "      <td>0.109531</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>history_1</td>\n",
       "      <td>0.049944</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>22</th>\n",
       "      <td>savings_1</td>\n",
       "      <td>0.049466</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>53</th>\n",
       "      <td>property_3</td>\n",
       "      <td>0.032847</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>20</th>\n",
       "      <td>purpose_9</td>\n",
       "      <td>0.029254</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>27</th>\n",
       "      <td>employed_1</td>\n",
       "      <td>0.028681</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>23</th>\n",
       "      <td>savings_2</td>\n",
       "      <td>0.027405</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>history_0</td>\n",
       "      <td>0.024795</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>52</th>\n",
       "      <td>property_2</td>\n",
       "      <td>0.020972</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>40</th>\n",
       "      <td>coapp_1</td>\n",
       "      <td>0.017303</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>13</th>\n",
       "      <td>purpose_1</td>\n",
       "      <td>0.016402</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>42</th>\n",
       "      <td>coapp_3</td>\n",
       "      <td>0.015233</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>38</th>\n",
       "      <td>marital_3</td>\n",
       "      <td>0.015106</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>history_4</td>\n",
       "      <td>0.012360</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>history_2</td>\n",
       "      <td>0.011716</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>31</th>\n",
       "      <td>employed_5</td>\n",
       "      <td>0.011655</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>45</th>\n",
       "      <td>installp_3</td>\n",
       "      <td>0.011386</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       feature  importance\n",
       "1       amount    0.160722\n",
       "6   checking_4    0.128372\n",
       "0     duration    0.110019\n",
       "2          age    0.109531\n",
       "8    history_1    0.049944\n",
       "22   savings_1    0.049466\n",
       "53  property_3    0.032847\n",
       "20   purpose_9    0.029254\n",
       "27  employed_1    0.028681\n",
       "23   savings_2    0.027405\n",
       "7    history_0    0.024795\n",
       "52  property_2    0.020972\n",
       "40     coapp_1    0.017303\n",
       "13   purpose_1    0.016402\n",
       "42     coapp_3    0.015233\n",
       "38   marital_3    0.015106\n",
       "11   history_4    0.012360\n",
       "9    history_2    0.011716\n",
       "31  employed_5    0.011655\n",
       "45  installp_3    0.011386"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 查看特征的重要性排序\n",
    "import pandas as pd\n",
    "features = pd.DataFrame()\n",
    "features['feature'] = X_train.columns\n",
    "features['importance'] = dtree.feature_importances_\n",
    "features = features.sort_values(by =['importance'], ascending=False)\n",
    "\n",
    "# 显示最重要的前10个特征变量\n",
    "features.head(20)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "d32381bb-85c6-4f8b-87e0-db7db1b79eb8",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 把类别型变量进行独热编码(1->N)\n",
    "checking = pd.get_dummies(credit_df.checking,prefix='checking')\n",
    "history = pd.get_dummies(credit_df.history,prefix='history')\n",
    "purpose = pd.get_dummies(credit_df.purpose,prefix='purpose')\n",
    "savings = pd.get_dummies(credit_df.savings,prefix='savings')\n",
    "employed = pd.get_dummies(credit_df.employed,prefix='employed')\n",
    "installp = pd.get_dummies(credit_df.installp,prefix='installp')\n",
    "marital = pd.get_dummies(credit_df.marital,prefix='marital')\n",
    "coapp = pd.get_dummies(credit_df.coapp,prefix='coapp')\n",
    "installp = pd.get_dummies(credit_df.installp,prefix='installp')\n",
    "resident = pd.get_dummies(credit_df.resident,prefix='resident')\n",
    "property = pd.get_dummies(credit_df.property,prefix='property')\n",
    "housing = pd.get_dummies(credit_df.housing,prefix='housing')\n",
    "existcr = pd.get_dummies(credit_df.existcr,prefix='existcr')\n",
    "job = pd.get_dummies(credit_df.job,prefix='job')\n",
    "depends = pd.get_dummies(credit_df.depends,prefix='depends')\n",
    "telephon = pd.get_dummies(credit_df.telephon,prefix='telephon')\n",
    "foreign = pd.get_dummies(credit_df.foreign,prefix='foreign')\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "e6a91503-a9ff-4e1e-af58-06248d7e7581",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "target\n",
       "0    700\n",
       "1    300\n",
       "Name: count, dtype: int64"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 构造目标变量y的数据对象\n",
    "# 当前的目标变量good_bad的取值是'good'和'bad'，一般我们习惯把二分类的类别值编码为0和1，1一般表示类别比较少的那一类，他们往往是我们感兴趣的\n",
    "credit_df['target'] = 0\n",
    "credit_df.loc[(credit_df.good_bad == 'bad'), 'target'] = 1\n",
    "\n",
    "trainData_y = credit_df['target'] \n",
    "trainData_y.value_counts()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "71701f20-ff0b-4bd3-88a8-3f0712f5f7c2",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 拆分训练集和测试集\n",
    "from sklearn.model_selection import train_test_split\n",
    "X_train, X_test, y_train, y_test = train_test_split(trainData_X, trainData_y, test_size=0.3, random_state=1024)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "d163fe8d-3ea1-432e-8e49-fb5cff1a6e90",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style>#sk-container-id-2 {\n",
       "  /* Definition of color scheme common for light and dark mode */\n",
       "  --sklearn-color-text: black;\n",
       "  --sklearn-color-line: gray;\n",
       "  /* Definition of color scheme for unfitted estimators */\n",
       "  --sklearn-color-unfitted-level-0: #fff5e6;\n",
       "  --sklearn-color-unfitted-level-1: #f6e4d2;\n",
       "  --sklearn-color-unfitted-level-2: #ffe0b3;\n",
       "  --sklearn-color-unfitted-level-3: chocolate;\n",
       "  /* Definition of color scheme for fitted estimators */\n",
       "  --sklearn-color-fitted-level-0: #f0f8ff;\n",
       "  --sklearn-color-fitted-level-1: #d4ebff;\n",
       "  --sklearn-color-fitted-level-2: #b3dbfd;\n",
       "  --sklearn-color-fitted-level-3: cornflowerblue;\n",
       "\n",
       "  /* Specific color for light theme */\n",
       "  --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n",
       "  --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-icon: #696969;\n",
       "\n",
       "  @media (prefers-color-scheme: dark) {\n",
       "    /* Redefinition of color scheme for dark theme */\n",
       "    --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n",
       "    --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-icon: #878787;\n",
       "  }\n",
       "}\n",
       "\n",
       "#sk-container-id-2 {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 pre {\n",
       "  padding: 0;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 input.sk-hidden--visually {\n",
       "  border: 0;\n",
       "  clip: rect(1px 1px 1px 1px);\n",
       "  clip: rect(1px, 1px, 1px, 1px);\n",
       "  height: 1px;\n",
       "  margin: -1px;\n",
       "  overflow: hidden;\n",
       "  padding: 0;\n",
       "  position: absolute;\n",
       "  width: 1px;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-dashed-wrapped {\n",
       "  border: 1px dashed var(--sklearn-color-line);\n",
       "  margin: 0 0.4em 0.5em 0.4em;\n",
       "  box-sizing: border-box;\n",
       "  padding-bottom: 0.4em;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-container {\n",
       "  /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
       "     but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
       "     so we also need the `!important` here to be able to override the\n",
       "     default hidden behavior on the sphinx rendered scikit-learn.org.\n",
       "     See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n",
       "  display: inline-block !important;\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-text-repr-fallback {\n",
       "  display: none;\n",
       "}\n",
       "\n",
       "div.sk-parallel-item,\n",
       "div.sk-serial,\n",
       "div.sk-item {\n",
       "  /* draw centered vertical line to link estimators */\n",
       "  background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n",
       "  background-size: 2px 100%;\n",
       "  background-repeat: no-repeat;\n",
       "  background-position: center center;\n",
       "}\n",
       "\n",
       "/* Parallel-specific style estimator block */\n",
       "\n",
       "#sk-container-id-2 div.sk-parallel-item::after {\n",
       "  content: \"\";\n",
       "  width: 100%;\n",
       "  border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
       "  flex-grow: 1;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-parallel {\n",
       "  display: flex;\n",
       "  align-items: stretch;\n",
       "  justify-content: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-parallel-item {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-parallel-item:first-child::after {\n",
       "  align-self: flex-end;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-parallel-item:last-child::after {\n",
       "  align-self: flex-start;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-parallel-item:only-child::after {\n",
       "  width: 0;\n",
       "}\n",
       "\n",
       "/* Serial-specific style estimator block */\n",
       "\n",
       "#sk-container-id-2 div.sk-serial {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "  align-items: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  padding-right: 1em;\n",
       "  padding-left: 1em;\n",
       "}\n",
       "\n",
       "\n",
       "/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n",
       "clickable and can be expanded/collapsed.\n",
       "- Pipeline and ColumnTransformer use this feature and define the default style\n",
       "- Estimators will overwrite some part of the style using the `sk-estimator` class\n",
       "*/\n",
       "\n",
       "/* Pipeline and ColumnTransformer style (default) */\n",
       "\n",
       "#sk-container-id-2 div.sk-toggleable {\n",
       "  /* Default theme specific background. It is overwritten whether we have a\n",
       "  specific estimator or a Pipeline/ColumnTransformer */\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "/* Toggleable label */\n",
       "#sk-container-id-2 label.sk-toggleable__label {\n",
       "  cursor: pointer;\n",
       "  display: block;\n",
       "  width: 100%;\n",
       "  margin-bottom: 0;\n",
       "  padding: 0.5em;\n",
       "  box-sizing: border-box;\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 label.sk-toggleable__label-arrow:before {\n",
       "  /* Arrow on the left of the label */\n",
       "  content: \"▸\";\n",
       "  float: left;\n",
       "  margin-right: 0.25em;\n",
       "  color: var(--sklearn-color-icon);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 label.sk-toggleable__label-arrow:hover:before {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "/* Toggleable content - dropdown */\n",
       "\n",
       "#sk-container-id-2 div.sk-toggleable__content {\n",
       "  max-height: 0;\n",
       "  max-width: 0;\n",
       "  overflow: hidden;\n",
       "  text-align: left;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-toggleable__content.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-toggleable__content pre {\n",
       "  margin: 0.2em;\n",
       "  border-radius: 0.25em;\n",
       "  color: var(--sklearn-color-text);\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-toggleable__content.fitted pre {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n",
       "  /* Expand drop-down */\n",
       "  max-height: 200px;\n",
       "  max-width: 100%;\n",
       "  overflow: auto;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
       "  content: \"▾\";\n",
       "}\n",
       "\n",
       "/* Pipeline/ColumnTransformer-specific style */\n",
       "\n",
       "#sk-container-id-2 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator-specific style */\n",
       "\n",
       "/* Colorize estimator box */\n",
       "#sk-container-id-2 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-label label.sk-toggleable__label,\n",
       "#sk-container-id-2 div.sk-label label {\n",
       "  /* The background is the default theme color */\n",
       "  color: var(--sklearn-color-text-on-default-background);\n",
       "}\n",
       "\n",
       "/* On hover, darken the color of the background */\n",
       "#sk-container-id-2 div.sk-label:hover label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "/* Label box, darken color on hover, fitted */\n",
       "#sk-container-id-2 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator label */\n",
       "\n",
       "#sk-container-id-2 div.sk-label label {\n",
       "  font-family: monospace;\n",
       "  font-weight: bold;\n",
       "  display: inline-block;\n",
       "  line-height: 1.2em;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-label-container {\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "/* Estimator-specific */\n",
       "#sk-container-id-2 div.sk-estimator {\n",
       "  font-family: monospace;\n",
       "  border: 1px dotted var(--sklearn-color-border-box);\n",
       "  border-radius: 0.25em;\n",
       "  box-sizing: border-box;\n",
       "  margin-bottom: 0.5em;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-estimator.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "/* on hover */\n",
       "#sk-container-id-2 div.sk-estimator:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-estimator.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Specification for estimator info (e.g. \"i\" and \"?\") */\n",
       "\n",
       "/* Common style for \"i\" and \"?\" */\n",
       "\n",
       ".sk-estimator-doc-link,\n",
       "a:link.sk-estimator-doc-link,\n",
       "a:visited.sk-estimator-doc-link {\n",
       "  float: right;\n",
       "  font-size: smaller;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1em;\n",
       "  height: 1em;\n",
       "  width: 1em;\n",
       "  text-decoration: none !important;\n",
       "  margin-left: 1ex;\n",
       "  /* unfitted */\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted,\n",
       "a:link.sk-estimator-doc-link.fitted,\n",
       "a:visited.sk-estimator-doc-link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "div.sk-estimator:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "/* Span, style for the box shown on hovering the info icon */\n",
       ".sk-estimator-doc-link span {\n",
       "  display: none;\n",
       "  z-index: 9999;\n",
       "  position: relative;\n",
       "  font-weight: normal;\n",
       "  right: .2ex;\n",
       "  padding: .5ex;\n",
       "  margin: .5ex;\n",
       "  width: min-content;\n",
       "  min-width: 20ex;\n",
       "  max-width: 50ex;\n",
       "  color: var(--sklearn-color-text);\n",
       "  box-shadow: 2pt 2pt 4pt #999;\n",
       "  /* unfitted */\n",
       "  background: var(--sklearn-color-unfitted-level-0);\n",
       "  border: .5pt solid var(--sklearn-color-unfitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted span {\n",
       "  /* fitted */\n",
       "  background: var(--sklearn-color-fitted-level-0);\n",
       "  border: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link:hover span {\n",
       "  display: block;\n",
       "}\n",
       "\n",
       "/* \"?\"-specific style due to the `<a>` HTML tag */\n",
       "\n",
       "#sk-container-id-2 a.estimator_doc_link {\n",
       "  float: right;\n",
       "  font-size: 1rem;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1rem;\n",
       "  height: 1rem;\n",
       "  width: 1rem;\n",
       "  text-decoration: none;\n",
       "  /* unfitted */\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 a.estimator_doc_link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "#sk-container-id-2 a.estimator_doc_link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 a.estimator_doc_link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "</style><div id=\"sk-container-id-2\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>RandomForestClassifier()</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-2\" type=\"checkbox\" checked><label for=\"sk-estimator-id-2\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\">&nbsp;&nbsp;RandomForestClassifier<a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.4/modules/generated/sklearn.ensemble.RandomForestClassifier.html\">?<span>Documentation for RandomForestClassifier</span></a><span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></label><div class=\"sk-toggleable__content fitted\"><pre>RandomForestClassifier()</pre></div> </div></div></div></div>"
      ],
      "text/plain": [
       "RandomForestClassifier()"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.ensemble import RandomForestClassifier\n",
    "\n",
    "# 通过RandomForestClassifier类定义一个随机森林模型，名字叫rf\n",
    "rf = RandomForestClassifier(n_estimators = 100)\n",
    "\n",
    "# 对lr模型进行训练(fit)\n",
    "rf.fit(X_train, y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "6d8fa4e7-1943-49eb-b1dc-cdc4535f4be2",
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "features = pd.DataFrame()\n",
    "features['feature'] = X_train.columns\n",
    "features['importance'] = rf.feature_importances_\n",
    "features = features.sort_values(by =['importance'], ascending=False)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "65cf9980-494f-468b-81d0-2cac4e263a60",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'criterion': 'entropy', 'max_features': 4, 'n_estimators': 10}"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# grid search调参\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "\n",
    "parameters = {\n",
    "    'n_estimators':[5,10,15,20,30],\n",
    "    'max_features':[1,2,3,4],\n",
    "    'criterion':['gini','entropy']\n",
    "}\n",
    "\n",
    "rf = RandomForestClassifier()\n",
    "rf_search = GridSearchCV(rf, parameters, scoring='accuracy', cv=5)\n",
    "rf_search.fit(X_train, y_train)\n",
    "\n",
    "#查看最佳结果\n",
    "rf_search.best_estimator_\n",
    "rf_search.best_score_\n",
    "rf_search.best_params_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "b85ec47d-1419-4ecb-b76a-262c8270de0b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style>#sk-container-id-3 {\n",
       "  /* Definition of color scheme common for light and dark mode */\n",
       "  --sklearn-color-text: black;\n",
       "  --sklearn-color-line: gray;\n",
       "  /* Definition of color scheme for unfitted estimators */\n",
       "  --sklearn-color-unfitted-level-0: #fff5e6;\n",
       "  --sklearn-color-unfitted-level-1: #f6e4d2;\n",
       "  --sklearn-color-unfitted-level-2: #ffe0b3;\n",
       "  --sklearn-color-unfitted-level-3: chocolate;\n",
       "  /* Definition of color scheme for fitted estimators */\n",
       "  --sklearn-color-fitted-level-0: #f0f8ff;\n",
       "  --sklearn-color-fitted-level-1: #d4ebff;\n",
       "  --sklearn-color-fitted-level-2: #b3dbfd;\n",
       "  --sklearn-color-fitted-level-3: cornflowerblue;\n",
       "\n",
       "  /* Specific color for light theme */\n",
       "  --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n",
       "  --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-icon: #696969;\n",
       "\n",
       "  @media (prefers-color-scheme: dark) {\n",
       "    /* Redefinition of color scheme for dark theme */\n",
       "    --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n",
       "    --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-icon: #878787;\n",
       "  }\n",
       "}\n",
       "\n",
       "#sk-container-id-3 {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "#sk-container-id-3 pre {\n",
       "  padding: 0;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 input.sk-hidden--visually {\n",
       "  border: 0;\n",
       "  clip: rect(1px 1px 1px 1px);\n",
       "  clip: rect(1px, 1px, 1px, 1px);\n",
       "  height: 1px;\n",
       "  margin: -1px;\n",
       "  overflow: hidden;\n",
       "  padding: 0;\n",
       "  position: absolute;\n",
       "  width: 1px;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-dashed-wrapped {\n",
       "  border: 1px dashed var(--sklearn-color-line);\n",
       "  margin: 0 0.4em 0.5em 0.4em;\n",
       "  box-sizing: border-box;\n",
       "  padding-bottom: 0.4em;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-container {\n",
       "  /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
       "     but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
       "     so we also need the `!important` here to be able to override the\n",
       "     default hidden behavior on the sphinx rendered scikit-learn.org.\n",
       "     See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n",
       "  display: inline-block !important;\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-text-repr-fallback {\n",
       "  display: none;\n",
       "}\n",
       "\n",
       "div.sk-parallel-item,\n",
       "div.sk-serial,\n",
       "div.sk-item {\n",
       "  /* draw centered vertical line to link estimators */\n",
       "  background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n",
       "  background-size: 2px 100%;\n",
       "  background-repeat: no-repeat;\n",
       "  background-position: center center;\n",
       "}\n",
       "\n",
       "/* Parallel-specific style estimator block */\n",
       "\n",
       "#sk-container-id-3 div.sk-parallel-item::after {\n",
       "  content: \"\";\n",
       "  width: 100%;\n",
       "  border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
       "  flex-grow: 1;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-parallel {\n",
       "  display: flex;\n",
       "  align-items: stretch;\n",
       "  justify-content: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-parallel-item {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-parallel-item:first-child::after {\n",
       "  align-self: flex-end;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-parallel-item:last-child::after {\n",
       "  align-self: flex-start;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-parallel-item:only-child::after {\n",
       "  width: 0;\n",
       "}\n",
       "\n",
       "/* Serial-specific style estimator block */\n",
       "\n",
       "#sk-container-id-3 div.sk-serial {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "  align-items: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  padding-right: 1em;\n",
       "  padding-left: 1em;\n",
       "}\n",
       "\n",
       "\n",
       "/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n",
       "clickable and can be expanded/collapsed.\n",
       "- Pipeline and ColumnTransformer use this feature and define the default style\n",
       "- Estimators will overwrite some part of the style using the `sk-estimator` class\n",
       "*/\n",
       "\n",
       "/* Pipeline and ColumnTransformer style (default) */\n",
       "\n",
       "#sk-container-id-3 div.sk-toggleable {\n",
       "  /* Default theme specific background. It is overwritten whether we have a\n",
       "  specific estimator or a Pipeline/ColumnTransformer */\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "/* Toggleable label */\n",
       "#sk-container-id-3 label.sk-toggleable__label {\n",
       "  cursor: pointer;\n",
       "  display: block;\n",
       "  width: 100%;\n",
       "  margin-bottom: 0;\n",
       "  padding: 0.5em;\n",
       "  box-sizing: border-box;\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 label.sk-toggleable__label-arrow:before {\n",
       "  /* Arrow on the left of the label */\n",
       "  content: \"▸\";\n",
       "  float: left;\n",
       "  margin-right: 0.25em;\n",
       "  color: var(--sklearn-color-icon);\n",
       "}\n",
       "\n",
       "#sk-container-id-3 label.sk-toggleable__label-arrow:hover:before {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "/* Toggleable content - dropdown */\n",
       "\n",
       "#sk-container-id-3 div.sk-toggleable__content {\n",
       "  max-height: 0;\n",
       "  max-width: 0;\n",
       "  overflow: hidden;\n",
       "  text-align: left;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-toggleable__content.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-toggleable__content pre {\n",
       "  margin: 0.2em;\n",
       "  border-radius: 0.25em;\n",
       "  color: var(--sklearn-color-text);\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-toggleable__content.fitted pre {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-3 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n",
       "  /* Expand drop-down */\n",
       "  max-height: 200px;\n",
       "  max-width: 100%;\n",
       "  overflow: auto;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
       "  content: \"▾\";\n",
       "}\n",
       "\n",
       "/* Pipeline/ColumnTransformer-specific style */\n",
       "\n",
       "#sk-container-id-3 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator-specific style */\n",
       "\n",
       "/* Colorize estimator box */\n",
       "#sk-container-id-3 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-label label.sk-toggleable__label,\n",
       "#sk-container-id-3 div.sk-label label {\n",
       "  /* The background is the default theme color */\n",
       "  color: var(--sklearn-color-text-on-default-background);\n",
       "}\n",
       "\n",
       "/* On hover, darken the color of the background */\n",
       "#sk-container-id-3 div.sk-label:hover label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "/* Label box, darken color on hover, fitted */\n",
       "#sk-container-id-3 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator label */\n",
       "\n",
       "#sk-container-id-3 div.sk-label label {\n",
       "  font-family: monospace;\n",
       "  font-weight: bold;\n",
       "  display: inline-block;\n",
       "  line-height: 1.2em;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-label-container {\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "/* Estimator-specific */\n",
       "#sk-container-id-3 div.sk-estimator {\n",
       "  font-family: monospace;\n",
       "  border: 1px dotted var(--sklearn-color-border-box);\n",
       "  border-radius: 0.25em;\n",
       "  box-sizing: border-box;\n",
       "  margin-bottom: 0.5em;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-estimator.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "/* on hover */\n",
       "#sk-container-id-3 div.sk-estimator:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-estimator.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Specification for estimator info (e.g. \"i\" and \"?\") */\n",
       "\n",
       "/* Common style for \"i\" and \"?\" */\n",
       "\n",
       ".sk-estimator-doc-link,\n",
       "a:link.sk-estimator-doc-link,\n",
       "a:visited.sk-estimator-doc-link {\n",
       "  float: right;\n",
       "  font-size: smaller;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1em;\n",
       "  height: 1em;\n",
       "  width: 1em;\n",
       "  text-decoration: none !important;\n",
       "  margin-left: 1ex;\n",
       "  /* unfitted */\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted,\n",
       "a:link.sk-estimator-doc-link.fitted,\n",
       "a:visited.sk-estimator-doc-link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "div.sk-estimator:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "/* Span, style for the box shown on hovering the info icon */\n",
       ".sk-estimator-doc-link span {\n",
       "  display: none;\n",
       "  z-index: 9999;\n",
       "  position: relative;\n",
       "  font-weight: normal;\n",
       "  right: .2ex;\n",
       "  padding: .5ex;\n",
       "  margin: .5ex;\n",
       "  width: min-content;\n",
       "  min-width: 20ex;\n",
       "  max-width: 50ex;\n",
       "  color: var(--sklearn-color-text);\n",
       "  box-shadow: 2pt 2pt 4pt #999;\n",
       "  /* unfitted */\n",
       "  background: var(--sklearn-color-unfitted-level-0);\n",
       "  border: .5pt solid var(--sklearn-color-unfitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted span {\n",
       "  /* fitted */\n",
       "  background: var(--sklearn-color-fitted-level-0);\n",
       "  border: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link:hover span {\n",
       "  display: block;\n",
       "}\n",
       "\n",
       "/* \"?\"-specific style due to the `<a>` HTML tag */\n",
       "\n",
       "#sk-container-id-3 a.estimator_doc_link {\n",
       "  float: right;\n",
       "  font-size: 1rem;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1rem;\n",
       "  height: 1rem;\n",
       "  width: 1rem;\n",
       "  text-decoration: none;\n",
       "  /* unfitted */\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 a.estimator_doc_link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "#sk-container-id-3 a.estimator_doc_link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 a.estimator_doc_link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "</style><div id=\"sk-container-id-3\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>RandomForestClassifier(max_features=3, n_estimators=30)</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-3\" type=\"checkbox\" checked><label for=\"sk-estimator-id-3\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\">&nbsp;&nbsp;RandomForestClassifier<a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.4/modules/generated/sklearn.ensemble.RandomForestClassifier.html\">?<span>Documentation for RandomForestClassifier</span></a><span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></label><div class=\"sk-toggleable__content fitted\"><pre>RandomForestClassifier(max_features=3, n_estimators=30)</pre></div> </div></div></div></div>"
      ],
      "text/plain": [
       "RandomForestClassifier(max_features=3, n_estimators=30)"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 用最佳参数重新训练模型\n",
    "rf = RandomForestClassifier(criterion='gini',max_features=3,n_estimators=30)\n",
    "rf.fit(X_train, y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "id": "c7d1ebac-6a5a-4077-97cd-029ef7e50447",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "              precision    recall  f1-score   support\n",
      "\n",
      "           0       0.71      0.98      0.83       199\n",
      "           1       0.88      0.22      0.35       101\n",
      "\n",
      "    accuracy                           0.73       300\n",
      "   macro avg       0.80      0.60      0.59       300\n",
      "weighted avg       0.77      0.73      0.67       300\n",
      "\n",
      "[[196   3]\n",
      " [ 79  22]]\n",
      "0.7728991492114036\n"
     ]
    },
    {
     "data": {
      "image/png": "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TpzAw8PD7Pw9e/akZcuWfP/999y/fx9bW1uuXbuGu7s7X3zxBfnz5+f27dt89913VK9enYMHD1KiRIlUxV6rVi3Wr19Ps2bN6NWrF7179wYwJTwnTpygVq1aFC5cmMmTJ+Pt7c2GDRsYOHAgYWFhjB492izWESNGULNmTWbPno2VlRWenp6EhoYmu6YtWrQgMTGRCRMmULhwYcLCwti1a5cpCbf0s3D48GFefPFFPDw8+OSTTyhevDghISGsWbOGuLi4J742KSmJl19+me3btzNs2DBq1arFxYsXGT16NPXr12ffvn04ODjwwQcfsH37drp168bBgwfx8/Nj4cKFfPfdd8ybN49y5coBEBsby+3btxk6dCgFChQgLi6OP//8k1dffZWFCxfStWtXs/P/+uuvHDx4kC+++AKDwcAHH3xAy5Yt6datG+fPn2fGjBmEh4czePBgXnvtNQ4dOmT2/y00NJSOHTsyfPhwPvnkE3777TfGjRvHnTt3mDFjxhOvl6XfQSKNlBCPWbhwoQLU33//reLj41VkZKRav3698vb2VnXr1lXx8fGmfUuWLKkqVapkVqaUUq1atVI+Pj4qMTFRKaVUz549la2trTpx4sQTzzt+/HhlZWWl9u7da1b+008/KUCtW7fOVObn56e6detm2l6zZo0C1B9//GEqS0hIUL6+vuq1114zlfXt21flyZNHXbx40ewckyZNUoA6fvy4Ukqp4OBgBaiiRYuquLi4Z10ytX79egWoCRMmmJUHBQUpQH377bdmsRsMBnXo0CGzfRs3bqxcXFzU/fv3Lb4egHJ1dVW3b99+apyJiYkqPj5effLJJ8rd3V0lJSWZnitTpoyqV69estc8uBYLFy40lY0ePTrF9ztgwABlb29vOu5vv/2mADVr1iyz/caPH68ANXr06KfG+8knnyhAbdy48Yn7PIivXLlyKiEhwVS+Z88eBahly5Y98bUJCQnq3r17ysnJSX311Vem8gf/B7p27frU+B4cIy4uThUvXly9//77FsV+8+bNJ16Hpk2bqoIFC6rw8HCz8nfeeUfZ29ubftebN29WgKpbt26yYzx4bvPmzUoppcLCwhSgpk2b9tT3ZMlnoWHDhsrNzU3duHHjqcd83LJlyxSgVq5caVa+d+9eBaiZM2eaysLCwlTBggVVtWrV1IEDB5Sjo6N68803n3r8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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from sklearn.metrics import classification_report\n",
    "from sklearn.metrics import confusion_matrix\n",
    "from sklearn.metrics import roc_curve\n",
    "from sklearn.metrics import auc\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "# 利用模型对测试集进行预测，输出target预测标签值和概率\n",
    "y_test_pred = rf.predict(X_test)\n",
    "y_test_prob = rf.predict_proba(X_test)\n",
    "\n",
    "# 分类评估汇总报告classification_report\n",
    "print(classification_report(y_test,y_test_pred))\n",
    "\n",
    "# 误分类矩阵 confusion_matrix\n",
    "print(confusion_matrix(y_test,y_test_pred))\n",
    "                       \n",
    "# ROC曲线\n",
    "fpr, tpr, thresholds =roc_curve(y_test, y_test_prob[:,1])\n",
    "\n",
    "# print AUC值\n",
    "auc = auc(fpr, tpr)\n",
    "print(auc)\n",
    "\n",
    "# plot ROC曲线\n",
    "plt.plot(fpr, tpr, lw=2, label='ROC curve (area = {:.2f})'.format(auc))\n",
    "plt.plot([0,1], [0, 1], 'r--')\n",
    "plt.xlabel('False Positive Rate')\n",
    "plt.ylabel('True Positive Rate')\n",
    "plt.title('Receiver operating characteristic example')\n",
    "plt.legend(loc='lower right')\n",
    "plt.show()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "id": "b20bd6d7-c2d2-4b31-bd84-4d44dd2db8d2",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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iRMn1KtXLyUkJMgYo969e+vSSy9V48aNdfToUe3evVtff/21lixZoq1bt2rTpk0KDQ2tztoBACiXy+H2+OOPa+/evercubPefffdcu9AsmPHDo0dO1bbt2/XE088oblz51apWAAAnOHyCSUfffSRvL299cknn5z31lqxsbFavny5PD099eGHH7pcJAAAleFyuKWnpys2NlbNmjWrsF2zZs3UsWNHZWRkuDoUAACV4nK4NW/eXKdOnXKq7alTpxQVFeXqUAAAVIrL4Xbbbbdp79692rBhQ4XtNmzYoPj4eI0ZM8bVoQAAqBSXw2369Om65ppr9Mc//lEvv/xymVnc6dOnNXfuXN1444267rrr9Oijj1a5WAAAnOHU2ZIDBw4sd7kxRqdOndLkyZM1depUNWvWTOHh4Tp27JiSk5NVUFAgLy8vZWdna8iQIfryyy+rtXgAAMrjVLitW7fugm3y8/O1b98+7du3r9TywsJCrV+/npsnAwBqjVPhtnbt2pquAwCAauNUuPXr16+m6wAAoNrwVAAAgO0QbgAA26nyI28OHDigxYsXa/v27crIyFBhYWG57SzL4mxJAECtqFK4Pffcc5o+fbrOnDnjOBuy5NE3kkot42xJAEBtcXm35IoVKzR16lQ1atRIb731ljp06CBJWrNmjebNm6f7779fgYGB8vPz00svvaSvvvqq2ooGAKAiLs/c5s6dK8uy9P7776tXr16aP3++JGnQoEGONo899phuvvlmPf744/rhhx+qXi0AAE5weea2ZcsWNWnSRL169Tpvm4YNG2rRokU6ffq0ZsyY4epQAABUisvhlpWVpaZNmzre+/n5OZafq0mTJoqNjeVCcABArXE53MLDw0sFWXh4uCQpLi6uTNucnBylp6e7OhQAAJXicrjFxMTo0KFDjvc9e/aUMUb//ve/S7X78ssvlZCQUGqWBwBATXI53IYOHaqcnBzHiSK33XabQkJC9M4776h379566KGHNHbsWF177bWyLEu33357tRUNAEBFXD5b8k9/+pMSEhKUkZEhSQoLC9PixYs1atQoffvtt/r2228dbW+55RY99thjVa8WAAAnuBxuLVu21Jtvvllq2ZAhQ3TgwAF9/vnnSkxMlL+/v/r06aNu3bpVuVAAAJxV5dtv/VZISIhGjRpVallOTo6Ki4sVHBxc3cMBAFBGrdw4uWXLlgoNDa2NoQAAqL2nApx7z0kAAGoSj7wBANgO4QYAsB3CDQBgO4QbAMB2CDcAgO04fZ3bhg0bXB6ksLDQ5b4AAFSW0+HWv39/WZbl0iDGGJf7AgBQWZW6QwnXqgEALgZOh1txcXFN1gEAQLXhhBIAgO0QbgAA2yHcAAC2Q7gBAGyHcAMA2A7hBgCwHcINAGA7hBsAwHYqdYeSi9m94/srMCjA3WUANaaw6LC7SwBqVGFRjtNtmbkBAGzHqZnbhAkTqjyQZVl6++23q/w5AABciFPhtmDBgioPRLgBAGqLU+E2f/78mq4DAIBq41S4jRs3rqbrAACg2nBCCQDAdgg3AIDtVMt1bps2bdL27duVkZGhwsLCcttYlqXHH3+8OoYDAKBCVQq3DRs2aOLEidq/f3+F7YwxhBsAoNa4HG67du3SsGHDVFhYqNGjR2v9+vVKSUnRo48+quTkZG3fvl3bt2+Xv7+/7r77bgUFBVVn3QAAnJfL4TZ79mzl5eXprbfe0vjx49WnTx+lpKToqaeecrRZvXq1Jk6cqFWrVum7776rloIBALgQl08oWbdunUJCQiq8TGDIkCFatmyZdu7cqZkzZ7o6FAAAleJyuB09elTR0dHy8Dj7EV5eZyeBubm5pdpdfvnlatu2rZYtW1aFMgEAcJ7L4RYSEqKioiLH+9DQUElSUlJSmbY+Pj5KTU11dSgAACrF5XBr3ry50tLSHO87duwoSfrkk09KtUtMTFRcXJyCg4NdHQoAgEpxOdwGDBig9PR0JSYmSpJuvfVWWZal6dOn67HHHtNnn32mefPmaciQISosLNQ111xTXTUDAFAhl8+WvPnmm/Xhhx9q48aNio6OVtu2bfXUU09p+vTpmjVrlqOdMUatWrXS7Nmzq6VgAAAuxOVw69mzp/bu3Vtq2bRp09S7d2+99957SkxMlL+/v3r37q2//OUvXOcGAKg11XL7rXP16dNHffr0qe6PBQDAadw4GQBgO4QbAMB2XN4t2apVq0q1tyxL+/btc3U4AACc5nK4lVwCcCGWZTmeCgAAQG1wOdwOHDhw3nWnTp1SQkKC3nzzTa1evVr/+te/dO2117o6FAAAleJyuLVo0aLC9e3bt9cNN9yg2bNna/LkyerWrdsF+wAAUB1q/ISShx9+WMHBwZoxY0ZNDwUAgKRaCDcPDw+1bNlSmzZtqumhAACQVAvhdubMGSUkJOjMmTM1PRQAAJJqONxOnDihO++8UydPnlS3bt1qcigAABxcPqFk4MCB511njNGxY8e0f/9+5eXlydvbm2NuAIBa43K4rVu3zql2PXr00D//+U/169fP1aEAAKgUl8Nt7dq1511nWZYCAwPVqlUrNWjQwNUhAABwicvhxkwMAFBXuXxCybvvvqtVq1Y51Xb16tV69913XR0KAIBKcTnc7rjjDj3zzDNOtZ01a5bGjx/v6lAAAFRKlS4FMMZUazsAAKpDrTzP7fDhwwoMDKyNoQAAcP6EkoMHD5Z5zE1mZqY2bNhw3j65ublav3694uPj1bNnT5eLBACgMpwOt/nz52vmzJmllu3YsUMDBgyosF/JLskHHnig8tUBAOACp8MtOjpaffv2dbxfv369goOD1aVLl3LbW5Ylf39/tWrVSiNHjlTv3r2rXCwAAM5wOtzGjRuncePGOd57eHioY8eOFV7MDQCAO1TpDiUhISHVWQsAANWCO5QAAGzH5UsBNmzYoIEDB+r111+vsN1//vMfDRw4UN98842rQwEAUCkuh9tbb72l9evX68orr6yw3ZVXXql169Zp3rx5rg4FAECluBxumzZtUmhoqDp16lRhu86dO6thw4bM3AAAtcblcEtNTVV0dLRTbaOjo5WamurqUAAAVIrL4ebj46Ps7Gyn2mZnZ8vDo1bu9AUAgOvh1q5dO+3du1fx8fEVtouPj1d8fLzatGnj6lAAAFSKy+F28803yxijsWPH6uTJk+W2OXnypMaNGyfLsjRixAhXhwIAoFIs4+LzaHJzc9W9e3fFxcUpPDxcEydOVM+ePVW/fn2dPHlSmzZt0rx583TkyBG1a9dOW7Zskb+/f3XXf0FZWVkKCQnRZ7v/R4FBAbU+PlBbropg7wjsLSsrR2GhVygzM1PBwcEVtnX5Im5/f3+tWrVKN910k3766SfNmjWrTBtjjC677DItXbrULcEGAPh9cjncJCkqKkqbN2/WsmXL9PHHH2v37t3KyspSUFCQOnTooBtvvFE33ngjJ5MAAGpVlcJNOnsD5VtuuUW33HJLddQDAECV1fiUKjU1Vc8+++wFL/YGAKC6VHnmVp6cnBwtXbpUCxcu1Lp16+TiOSsAALik2sKtuLhYq1ev1sKFC/Xxxx8rNzfXEWpdu3bVmDFjqmsoAAAqVOVw27p1qxYuXKhFixbp6NGjjkDz9fXVlClTNGbMGF166aVVLhQAAGe5FG4pKSl67733tHDhQu3evVvS2dP+GzRooBEjRuiNN95QgwYN9I9//KNaiwUAwBlOh1tOTo6WLFmihQsXav369TLGyBgjf39/XXfddRo9erSGDRsmb29vvfHGGzVZMwAAFXI63Bo3bqy8vDwZY+Tp6alBgwZp9OjRGj58uOrVq1eTNQIAUClOh1tubq4sy1KDBg30yiuvaNSoUbIsqyZrAwDAJU5f59ahQwcZY3TixAmNGTNGUVFRevDBB7Vly5aarA8AgEpzOtx++eUXbd26VZMnT1ZERIQOHTqkOXPmqEePHmrbtq1mzpyphISEmqwVAACnVOoOJZ07d9YLL7yg5ORkrVy5UqNGjZK/v7/27t2rGTNmqG3btrr88strqlYAAJzi0u23PDw8NGTIEL333ns6cuSI5s+frwEDBsiyLMduyqNHj2rQoEFasGCB00/sBgCgOlT53pKBgYEaN26cvvjiCx08eFCzZ89WbGysiouLtXbtWk2cOFERERG69dZbq6NeAAAuqFpvnBwZGamHH35YP//8s3766Sc98MADaty4sXJzc/X+++9X51AAAJxXjT0VoEuXLnrxxReVkpKiFStWMHMDANSaGnkqwLk8PDw0dOhQDR06tKaHAgBAUi08zw0AgNpGuAEAbIdwAwDYDuEGALAdwg0AYDuEGwDAdgg3AIDtEG4AANsh3AAAtkO4AQBsh3ADANgO4QYAsJ0av3Ey7CEt+ahuvfIup9rO+eApdbmyg+N9TtYpvf/6cm1YuUlpSUfk5eOlmEuj9cfb/6BBN/apqZKBSjPG6NtvtuqT5V9p48afFBd3QKdP5yosrIF6XtFZkybdpv4DepTpt3Xrbn380Zf6esOP2rUrQZmZOWrQIFjdurXXxDtv0Y03DnbD1vy+EW5wio+vt2Ivb3fe9RlHT+hQ0hH5+Prokg7RjuXH0tI1+U//TykH0uTh6aGWbZur6EyRftm8Wz9/v0vbv9+lKbP+WgtbAFzY2q++19A//FnS2SeaxFzSXIGB/krYm6SPPvxCH334haY9+lfNmHmvo8++fQfV8/IRjvctWzZTi+hIHdifolWrNmrVqo26fewf9eZbT8nDg51ltYVwg1MahjfQKx8+c971T987R4eSjqjXkMtULzjQsfyZ+19SyoE0RbeN0qwF09UkKlySlLDrgB65/R9avnCVYru31ZBb+tf0JgAXZIzRJZc01/0PjNWfRg5TgwYhkqSCgkLNnPGqnv3nW5r1zOvq0aOjrr2u/3/7SE2aNNK9992u0WOuV5MmjSRJxcXF+s+//0+TH5ilhe9+rO7dO2jS325z16b97vDPCFTZ6VO52rhqsyTp6pv7O5Yn7Dqgrd/ukCQ99OwkR7BJ0iXtW2rSE3dIkhb8a3Gt1QpU5PIeHfXzjuX6612jHMEmST4+3nr6Hw9o6NCzu9HffnupY12zZo21O26F/v7QBEewSWdnfpP+dpvu/MuI//ZZUktbAYlwQzX4+vNNyjudp/oNg9Wjf1fH8h0/7JEkNWrSUB26ty3Tr8/QnvLw8NChpCOK+3lfrdULnE9wcD15eZ1/h9agwVdKkvbuTXQs8/PzVUCA/3n7DL76qrN94pOqp0g4hXBDla1ZtkGSNPCG3vLy8nQsz848JUkKiwgtt5+3j7dCQoMkSbt+iq/hKoGqy8vLlyT5+/tVok/Bf/v41khNKF+dD7cNGzbo+uuvV2RkpCzL0kcffeTuknCO9CMZ+mnjL5KkITf3K7UuMChAknT8cEa5fQsLCpWZkS1JSt6XWoNVAlVnjNHSpaslSVdd1fUCrX+15IOVkqQrK9EHVVfnw+3UqVPq3LmzXnnlFXeXgnKs+XCDiouLFRXTVO26tC61rl3nSySdPWNy99a9ZfpuXLVZxcXFkn6d5QF11dtvLdG2rbvl4+Ote+8b41SfNau/0fKPv5IkPfjg+JosD79R58Nt2LBhevrppzV8+HB3l4JylOyS/O2sTZLad2ujNp1iJEmzp8xV8v5DjnW7forXq0/Od7zP/+/uHqAu2vrTLk2ZPFuSNGPmvYqJaX7BPgcPpmnc2EckSXfdPUp9+l5WozWiNNtdCpCfn6/8/F+/KLOystxYjb3t352kfbsSZVmWrh7et9w2j819QA+MeFxJe1M0rv99ahodocLCMzqcfFT1QgJ11dWX6ds1P8o/8PwH5AF3OnAgRTf+8W/Ky8vXqFuv1RQnZmAZGZm6/rq7dPz4CfXrd7mee/7hWqgU56rzM7fKmjVrlkJCQhw/UVFR7i7JtlYvXS9J6tSzvSKahZfbpnlMU7258gXdPPFaRUQ10uGUo8o7nafBN/XVm58/r4B6Z4/LhTaqX1tlA047fPi4rhl6p9LSjumaa/rq7XlPy7KsCvvk5JzWDdfdrd279qlb9/Za9tEr8vX1qaWKUcJ2M7dp06ZpypQpjvdZWVkEXA0oLi7Wlx9/Lan8XZLnahjeQPfOmKh7Z0wss67kEoC2/919CdQVGRmZGjb0Tu3bl6y+fS/TosUvytvbu8I++fkFuvmme7V588+6tH2MPv3sdQUFBVbYBzXDduHm6+srX19Oua1pW7/doWNp6fLx9VG/a6906TMOxB1U8r5U+fj6qHvvTtVcIeC6ktnXzh17ddllsfrw41cvePr/mTNndOuoB7V27fdq1aqZPl/5psLCGtRSxfgt2+2WRO0o2SX529ttOcsYozdn/48kafBNfRRUv1611ge46tzZV/sOl+jTFReefRljNHHCdH36yVpFRobr81VvKTKy/F31qB11fuaWk5OjhIQEx/sDBw5o27ZtCg0NVfPmFz5jCdUvPzdfX3++SVLp222V5+fNu1VYUKhuvTo6jlVknsjWazMX6Ns1P6pBo/r6y6O313TJgFOKioo0+ra/a+3a7xUTE6XPV76p0NCQC/abMnmWFv3vZwoLa6DPV72pli2b1UK1qEidD7cff/xRAwYMcLwvOZ42btw4LViwwE1V/b5tXLVZp3Nyy9xuqzxxPyfo1SfnK6Cev5pEhcsYKSkhRUVnihQWEapn/+dx1Q8NrqXKgYp98MEqx3VploeHbh05pdx2EU0a6f8WvyhJ2vTdNr36yv9KOnsXkrv/+uR5P3/dhoXVWzDOq86HW//+/WWMcXcZOEfJLsnf3m6rPF2ujNUfbumvnVvilJp0RJYlRbdupj7DrtCIO6933MUEqAsK8gscrxP2Jilhb/n3g2zRItLxOv+cPsnJh5WcfLjmCoTTLGPz5MjKylJISIg+2/0/fJHC1q6KaOPuEoAalZWVo7DQK5SZmang4Ir3+HBCCQDAdgg3AIDtEG4AANsh3AAAtkO4AQBsh3ADANgO4QYAsB3CDQBgO4QbAMB2CDcAgO0QbgAA2yHcAAC2Q7gBAGyHcAMA2A7hBgCwHcINAGA7hBsAwHYINwCA7RBuAADbIdwAALZDuAEAbIdwAwDYDuEGALAdwg0AYDuEGwDAdgg3AIDtEG4AANsh3AAAtkO4AQBsh3ADANgO4QYAsB3CDQBgO4QbAMB2CDcAgO0QbgAA2yHcAAC2Q7gBAGyHcAMA2A7hBgCwHcINAGA7hBsAwHYINwCA7RBuAADbIdwAALZDuAEAbIdwAwDYDuEGALAdwg0AYDuEGwDAdgg3AIDtEG4AANsh3AAAtkO4AQBsh3ADANgO4QYAsB3CDQBgO4QbAMB2CDcAgO0QbgAA2yHcAAC2Q7gBAGyHcAMA2A7hBgCwHcINAGA7hBsAwHYINwCA7RBuAADbIdwAALZDuAEAbIdwAwDYDuEGALAdwg0AYDuEGwDAdgg3AIDtEG4AANsh3AAAtkO4AQBsh3ADANgO4QYAsB3CDQBgO4QbAMB2CDcAgO0QbgAA2yHcAAC24+XuAmqaMUaSdDrntJsrAWpWVkCOu0sAalR21ilJv36vV8QyzrS6iKWkpCgqKsrdZQAAqklycrKaNWtWYRvbh1txcbEOHTqkoKAgWZbl7nIAAC4yxig7O1uRkZHy8Kj4qJrtww0A8PvDCSUAANsh3AAAtkO4AQBsh3ADANgO4QYAsB3CDQBgO4QbAMB2/j/wsDUNrqsK2wAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 480x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 误分类矩阵\n",
    "def show_confusion_matrix(cnf_matrix, class_labels):\n",
    "    plt.matshow(cnf_matrix, cmap=plt.cm.YlGn, alpha=0.7)\n",
    "    ax = plt.gca()\n",
    "    ax.set_xlabel('Predicted Label', fontsize=16)\n",
    "    ax.set_xticks(range(0,len(class_labels)))\n",
    "    ax.set_xticklabels(class_labels,rotation=45)\n",
    "    ax.set_ylabel('Actual Label', fontsize=16, rotation=90)\n",
    "    ax.set_yticks(range(0,len(class_labels)))\n",
    "    ax.set_yticklabels(class_labels)\n",
    "    ax.xaxis.set_label_position('top')\n",
    "    ax.xaxis.tick_top()\n",
    "\n",
    "    for row in range(len(cnf_matrix)):\n",
    "        for col in range(len(cnf_matrix[row])):\n",
    "            ax.text(col, row, cnf_matrix[row][col], va='center', ha='center', fontsize=16)\n",
    "\n",
    "class_labels = [0,1]\n",
    "\n",
    "cnf_matrix = confusion_matrix(y_test, y_test_pred) \n",
    "show_confusion_matrix(cnf_matrix, class_labels)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "53f024cb-ecc2-4084-998e-bca97d57de43",
   "metadata": {},
   "source": [
    "# 作业"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 69,
   "id": "23f05717-2a60-489b-b9c9-249942dbc825",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "<>:3: SyntaxWarning: invalid escape sequence '\\w'\n",
      "<>:3: SyntaxWarning: invalid escape sequence '\\w'\n",
      "C:\\Users\\86147\\AppData\\Local\\Temp\\ipykernel_30184\\1152954807.py:3: SyntaxWarning: invalid escape sequence '\\w'\n",
      "  pen_df = pd.read_csv(\"D:\\work\\homework/pendigits.txt\", header = None)\n"
     ]
    }
   ],
   "source": [
    "import numpy as py\n",
    "import pandas as pd\n",
    "pen_df = pd.read_csv(\"D:\\work\\homework/pendigits.txt\", header = None)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 70,
   "id": "2b989897-4240-4296-9ae6-c3cb69bf67f6",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>0</th>\n",
       "      <th>1</th>\n",
       "      <th>2</th>\n",
       "      <th>3</th>\n",
       "      <th>4</th>\n",
       "      <th>5</th>\n",
       "      <th>6</th>\n",
       "      <th>7</th>\n",
       "      <th>8</th>\n",
       "      <th>9</th>\n",
       "      <th>10</th>\n",
       "      <th>11</th>\n",
       "      <th>12</th>\n",
       "      <th>13</th>\n",
       "      <th>14</th>\n",
       "      <th>15</th>\n",
       "      <th>16</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>47</td>\n",
       "      <td>100</td>\n",
       "      <td>27</td>\n",
       "      <td>81</td>\n",
       "      <td>57</td>\n",
       "      <td>37</td>\n",
       "      <td>26</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>23</td>\n",
       "      <td>56</td>\n",
       "      <td>53</td>\n",
       "      <td>100</td>\n",
       "      <td>90</td>\n",
       "      <td>40</td>\n",
       "      <td>98</td>\n",
       "      <td>8</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0</td>\n",
       "      <td>89</td>\n",
       "      <td>27</td>\n",
       "      <td>100</td>\n",
       "      <td>42</td>\n",
       "      <td>75</td>\n",
       "      <td>29</td>\n",
       "      <td>45</td>\n",
       "      <td>15</td>\n",
       "      <td>15</td>\n",
       "      <td>37</td>\n",
       "      <td>0</td>\n",
       "      <td>69</td>\n",
       "      <td>2</td>\n",
       "      <td>100</td>\n",
       "      <td>6</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0</td>\n",
       "      <td>57</td>\n",
       "      <td>31</td>\n",
       "      <td>68</td>\n",
       "      <td>72</td>\n",
       "      <td>90</td>\n",
       "      <td>100</td>\n",
       "      <td>100</td>\n",
       "      <td>76</td>\n",
       "      <td>75</td>\n",
       "      <td>50</td>\n",
       "      <td>51</td>\n",
       "      <td>28</td>\n",
       "      <td>25</td>\n",
       "      <td>16</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0</td>\n",
       "      <td>100</td>\n",
       "      <td>7</td>\n",
       "      <td>92</td>\n",
       "      <td>5</td>\n",
       "      <td>68</td>\n",
       "      <td>19</td>\n",
       "      <td>45</td>\n",
       "      <td>86</td>\n",
       "      <td>34</td>\n",
       "      <td>100</td>\n",
       "      <td>45</td>\n",
       "      <td>74</td>\n",
       "      <td>23</td>\n",
       "      <td>67</td>\n",
       "      <td>0</td>\n",
       "      <td>4</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0</td>\n",
       "      <td>67</td>\n",
       "      <td>49</td>\n",
       "      <td>83</td>\n",
       "      <td>100</td>\n",
       "      <td>100</td>\n",
       "      <td>81</td>\n",
       "      <td>80</td>\n",
       "      <td>60</td>\n",
       "      <td>60</td>\n",
       "      <td>40</td>\n",
       "      <td>40</td>\n",
       "      <td>33</td>\n",
       "      <td>20</td>\n",
       "      <td>47</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7489</th>\n",
       "      <td>0</td>\n",
       "      <td>82</td>\n",
       "      <td>9</td>\n",
       "      <td>59</td>\n",
       "      <td>56</td>\n",
       "      <td>34</td>\n",
       "      <td>41</td>\n",
       "      <td>0</td>\n",
       "      <td>10</td>\n",
       "      <td>30</td>\n",
       "      <td>3</td>\n",
       "      <td>67</td>\n",
       "      <td>42</td>\n",
       "      <td>96</td>\n",
       "      <td>100</td>\n",
       "      <td>100</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7490</th>\n",
       "      <td>49</td>\n",
       "      <td>100</td>\n",
       "      <td>0</td>\n",
       "      <td>70</td>\n",
       "      <td>24</td>\n",
       "      <td>56</td>\n",
       "      <td>100</td>\n",
       "      <td>65</td>\n",
       "      <td>86</td>\n",
       "      <td>85</td>\n",
       "      <td>44</td>\n",
       "      <td>77</td>\n",
       "      <td>21</td>\n",
       "      <td>38</td>\n",
       "      <td>6</td>\n",
       "      <td>0</td>\n",
       "      <td>4</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7491</th>\n",
       "      <td>100</td>\n",
       "      <td>98</td>\n",
       "      <td>60</td>\n",
       "      <td>100</td>\n",
       "      <td>24</td>\n",
       "      <td>87</td>\n",
       "      <td>3</td>\n",
       "      <td>58</td>\n",
       "      <td>35</td>\n",
       "      <td>51</td>\n",
       "      <td>58</td>\n",
       "      <td>26</td>\n",
       "      <td>36</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>5</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7492</th>\n",
       "      <td>59</td>\n",
       "      <td>65</td>\n",
       "      <td>91</td>\n",
       "      <td>100</td>\n",
       "      <td>84</td>\n",
       "      <td>96</td>\n",
       "      <td>72</td>\n",
       "      <td>50</td>\n",
       "      <td>51</td>\n",
       "      <td>8</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>45</td>\n",
       "      <td>1</td>\n",
       "      <td>100</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7493</th>\n",
       "      <td>0</td>\n",
       "      <td>78</td>\n",
       "      <td>29</td>\n",
       "      <td>100</td>\n",
       "      <td>94</td>\n",
       "      <td>86</td>\n",
       "      <td>70</td>\n",
       "      <td>48</td>\n",
       "      <td>42</td>\n",
       "      <td>11</td>\n",
       "      <td>32</td>\n",
       "      <td>0</td>\n",
       "      <td>25</td>\n",
       "      <td>36</td>\n",
       "      <td>100</td>\n",
       "      <td>40</td>\n",
       "      <td>7</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>7494 rows × 17 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "       0    1   2    3    4    5    6    7   8   9    10  11   12  13   14  \\\n",
       "0      47  100  27   81   57   37   26    0   0  23   56  53  100  90   40   \n",
       "1       0   89  27  100   42   75   29   45  15  15   37   0   69   2  100   \n",
       "2       0   57  31   68   72   90  100  100  76  75   50  51   28  25   16   \n",
       "3       0  100   7   92    5   68   19   45  86  34  100  45   74  23   67   \n",
       "4       0   67  49   83  100  100   81   80  60  60   40  40   33  20   47   \n",
       "...   ...  ...  ..  ...  ...  ...  ...  ...  ..  ..  ...  ..  ...  ..  ...   \n",
       "7489    0   82   9   59   56   34   41    0  10  30    3  67   42  96  100   \n",
       "7490   49  100   0   70   24   56  100   65  86  85   44  77   21  38    6   \n",
       "7491  100   98  60  100   24   87    3   58  35  51   58  26   36   0    0   \n",
       "7492   59   65  91  100   84   96   72   50  51   8    0   0   45   1  100   \n",
       "7493    0   78  29  100   94   86   70   48  42  11   32   0   25  36  100   \n",
       "\n",
       "       15  16  \n",
       "0      98   8  \n",
       "1       6   2  \n",
       "2       0   1  \n",
       "3       0   4  \n",
       "4       0   1  \n",
       "...   ...  ..  \n",
       "7489  100   5  \n",
       "7490    0   4  \n",
       "7491    5   5  \n",
       "7492    0   1  \n",
       "7493   40   7  \n",
       "\n",
       "[7494 rows x 17 columns]"
      ]
     },
     "execution_count": 70,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pen_df"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4410c6f2-7ddf-4263-aa9a-f51b6cda666a",
   "metadata": {},
   "source": [
    "### 检查数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 71,
   "id": "38a88c2d-ef3c-4a64-a641-b0bc24d049dd",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 7494 entries, 0 to 7493\n",
      "Data columns (total 17 columns):\n",
      " #   Column  Non-Null Count  Dtype\n",
      "---  ------  --------------  -----\n",
      " 0   0       7494 non-null   int64\n",
      " 1   1       7494 non-null   int64\n",
      " 2   2       7494 non-null   int64\n",
      " 3   3       7494 non-null   int64\n",
      " 4   4       7494 non-null   int64\n",
      " 5   5       7494 non-null   int64\n",
      " 6   6       7494 non-null   int64\n",
      " 7   7       7494 non-null   int64\n",
      " 8   8       7494 non-null   int64\n",
      " 9   9       7494 non-null   int64\n",
      " 10  10      7494 non-null   int64\n",
      " 11  11      7494 non-null   int64\n",
      " 12  12      7494 non-null   int64\n",
      " 13  13      7494 non-null   int64\n",
      " 14  14      7494 non-null   int64\n",
      " 15  15      7494 non-null   int64\n",
      " 16  16      7494 non-null   int64\n",
      "dtypes: int64(17)\n",
      "memory usage: 995.4 KB\n"
     ]
    }
   ],
   "source": [
    "pen_df.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 72,
   "id": "7092b7ec-6dcc-4edc-967c-7fe6f1650589",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>0</th>\n",
       "      <th>1</th>\n",
       "      <th>2</th>\n",
       "      <th>3</th>\n",
       "      <th>4</th>\n",
       "      <th>5</th>\n",
       "      <th>6</th>\n",
       "      <th>7</th>\n",
       "      <th>8</th>\n",
       "      <th>9</th>\n",
       "      <th>10</th>\n",
       "      <th>11</th>\n",
       "      <th>12</th>\n",
       "      <th>13</th>\n",
       "      <th>14</th>\n",
       "      <th>15</th>\n",
       "      <th>16</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>7494.000000</td>\n",
       "      <td>7494.000000</td>\n",
       "      <td>7494.000000</td>\n",
       "      <td>7494.000000</td>\n",
       "      <td>7494.000000</td>\n",
       "      <td>7494.000000</td>\n",
       "      <td>7494.000000</td>\n",
       "      <td>7494.000000</td>\n",
       "      <td>7494.000000</td>\n",
       "      <td>7494.000000</td>\n",
       "      <td>7494.000000</td>\n",
       "      <td>7494.000000</td>\n",
       "      <td>7494.000000</td>\n",
       "      <td>7494.000000</td>\n",
       "      <td>7494.000000</td>\n",
       "      <td>7494.000000</td>\n",
       "      <td>7494.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>37.384307</td>\n",
       "      <td>84.679343</td>\n",
       "      <td>40.005604</td>\n",
       "      <td>82.889512</td>\n",
       "      <td>50.878303</td>\n",
       "      <td>65.044436</td>\n",
       "      <td>51.471844</td>\n",
       "      <td>44.599680</td>\n",
       "      <td>57.129971</td>\n",
       "      <td>34.069122</td>\n",
       "      <td>61.417401</td>\n",
       "      <td>35.782092</td>\n",
       "      <td>54.699760</td>\n",
       "      <td>35.800774</td>\n",
       "      <td>46.813718</td>\n",
       "      <td>28.565386</td>\n",
       "      <td>4.430878</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>33.322024</td>\n",
       "      <td>16.848420</td>\n",
       "      <td>26.256025</td>\n",
       "      <td>19.638582</td>\n",
       "      <td>34.927201</td>\n",
       "      <td>27.377341</td>\n",
       "      <td>30.680075</td>\n",
       "      <td>30.659478</td>\n",
       "      <td>33.680340</td>\n",
       "      <td>27.459989</td>\n",
       "      <td>37.130762</td>\n",
       "      <td>27.495836</td>\n",
       "      <td>22.599781</td>\n",
       "      <td>33.223611</td>\n",
       "      <td>41.531794</td>\n",
       "      <td>35.811094</td>\n",
       "      <td>2.876981</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>5.000000</td>\n",
       "      <td>76.000000</td>\n",
       "      <td>20.000000</td>\n",
       "      <td>70.000000</td>\n",
       "      <td>17.000000</td>\n",
       "      <td>48.000000</td>\n",
       "      <td>28.000000</td>\n",
       "      <td>22.000000</td>\n",
       "      <td>30.000000</td>\n",
       "      <td>7.000000</td>\n",
       "      <td>25.000000</td>\n",
       "      <td>12.000000</td>\n",
       "      <td>41.000000</td>\n",
       "      <td>7.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>2.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>31.000000</td>\n",
       "      <td>89.000000</td>\n",
       "      <td>39.000000</td>\n",
       "      <td>89.000000</td>\n",
       "      <td>56.000000</td>\n",
       "      <td>71.000000</td>\n",
       "      <td>54.000000</td>\n",
       "      <td>42.000000</td>\n",
       "      <td>60.000000</td>\n",
       "      <td>33.000000</td>\n",
       "      <td>74.000000</td>\n",
       "      <td>32.000000</td>\n",
       "      <td>53.000000</td>\n",
       "      <td>28.000000</td>\n",
       "      <td>39.000000</td>\n",
       "      <td>8.000000</td>\n",
       "      <td>4.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>61.000000</td>\n",
       "      <td>100.000000</td>\n",
       "      <td>58.000000</td>\n",
       "      <td>100.000000</td>\n",
       "      <td>81.000000</td>\n",
       "      <td>86.000000</td>\n",
       "      <td>75.000000</td>\n",
       "      <td>65.000000</td>\n",
       "      <td>88.000000</td>\n",
       "      <td>55.000000</td>\n",
       "      <td>98.000000</td>\n",
       "      <td>57.000000</td>\n",
       "      <td>69.000000</td>\n",
       "      <td>48.000000</td>\n",
       "      <td>100.000000</td>\n",
       "      <td>51.000000</td>\n",
       "      <td>7.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>100.000000</td>\n",
       "      <td>100.000000</td>\n",
       "      <td>100.000000</td>\n",
       "      <td>100.000000</td>\n",
       "      <td>100.000000</td>\n",
       "      <td>100.000000</td>\n",
       "      <td>100.000000</td>\n",
       "      <td>100.000000</td>\n",
       "      <td>100.000000</td>\n",
       "      <td>100.000000</td>\n",
       "      <td>100.000000</td>\n",
       "      <td>100.000000</td>\n",
       "      <td>100.000000</td>\n",
       "      <td>100.000000</td>\n",
       "      <td>100.000000</td>\n",
       "      <td>100.000000</td>\n",
       "      <td>9.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                0            1            2            3            4   \\\n",
       "count  7494.000000  7494.000000  7494.000000  7494.000000  7494.000000   \n",
       "mean     37.384307    84.679343    40.005604    82.889512    50.878303   \n",
       "std      33.322024    16.848420    26.256025    19.638582    34.927201   \n",
       "min       0.000000     0.000000     0.000000     0.000000     0.000000   \n",
       "25%       5.000000    76.000000    20.000000    70.000000    17.000000   \n",
       "50%      31.000000    89.000000    39.000000    89.000000    56.000000   \n",
       "75%      61.000000   100.000000    58.000000   100.000000    81.000000   \n",
       "max     100.000000   100.000000   100.000000   100.000000   100.000000   \n",
       "\n",
       "                5            6            7            8            9   \\\n",
       "count  7494.000000  7494.000000  7494.000000  7494.000000  7494.000000   \n",
       "mean     65.044436    51.471844    44.599680    57.129971    34.069122   \n",
       "std      27.377341    30.680075    30.659478    33.680340    27.459989   \n",
       "min       0.000000     0.000000     0.000000     0.000000     0.000000   \n",
       "25%      48.000000    28.000000    22.000000    30.000000     7.000000   \n",
       "50%      71.000000    54.000000    42.000000    60.000000    33.000000   \n",
       "75%      86.000000    75.000000    65.000000    88.000000    55.000000   \n",
       "max     100.000000   100.000000   100.000000   100.000000   100.000000   \n",
       "\n",
       "                10           11           12           13           14  \\\n",
       "count  7494.000000  7494.000000  7494.000000  7494.000000  7494.000000   \n",
       "mean     61.417401    35.782092    54.699760    35.800774    46.813718   \n",
       "std      37.130762    27.495836    22.599781    33.223611    41.531794   \n",
       "min       0.000000     0.000000     0.000000     0.000000     0.000000   \n",
       "25%      25.000000    12.000000    41.000000     7.000000     0.000000   \n",
       "50%      74.000000    32.000000    53.000000    28.000000    39.000000   \n",
       "75%      98.000000    57.000000    69.000000    48.000000   100.000000   \n",
       "max     100.000000   100.000000   100.000000   100.000000   100.000000   \n",
       "\n",
       "                15           16  \n",
       "count  7494.000000  7494.000000  \n",
       "mean     28.565386     4.430878  \n",
       "std      35.811094     2.876981  \n",
       "min       0.000000     0.000000  \n",
       "25%       0.000000     2.000000  \n",
       "50%       8.000000     4.000000  \n",
       "75%      51.000000     7.000000  \n",
       "max     100.000000     9.000000  "
      ]
     },
     "execution_count": 72,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pen_df.describe()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 73,
   "id": "b98ea2d8-5ed0-40ad-aa1c-97cc71fbd743",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0     0\n",
       "1     0\n",
       "2     0\n",
       "3     0\n",
       "4     0\n",
       "5     0\n",
       "6     0\n",
       "7     0\n",
       "8     0\n",
       "9     0\n",
       "10    0\n",
       "11    0\n",
       "12    0\n",
       "13    0\n",
       "14    0\n",
       "15    0\n",
       "16    0\n",
       "dtype: int64"
      ]
     },
     "execution_count": 73,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pen_df.isnull().sum()  #检查数据是否有空值"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 74,
   "id": "9e712c00-8d9d-4092-8cdf-99cb1dbf34bc",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>0</th>\n",
       "      <th>1</th>\n",
       "      <th>2</th>\n",
       "      <th>3</th>\n",
       "      <th>4</th>\n",
       "      <th>5</th>\n",
       "      <th>6</th>\n",
       "      <th>7</th>\n",
       "      <th>8</th>\n",
       "      <th>9</th>\n",
       "      <th>10</th>\n",
       "      <th>11</th>\n",
       "      <th>12</th>\n",
       "      <th>13</th>\n",
       "      <th>14</th>\n",
       "      <th>15</th>\n",
       "      <th>16</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "Empty DataFrame\n",
       "Columns: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]\n",
       "Index: []"
      ]
     },
     "execution_count": 74,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pen_df[pen_df.duplicated()]  #检查数据是否有重复"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 85,
   "id": "d752f4d9-3f69-4be0-a647-7a6217c0093d",
   "metadata": {},
   "outputs": [],
   "source": [
    "trainData_X= pen_df.iloc[:,0:16]\n",
    "trainData_y = pen_df.iloc[:,16]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 86,
   "id": "093f41ca-ad75-41a5-b985-71dcc501a71a",
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.model_selection import train_test_split\n",
    "X_train, X_test, y_train, y_test = train_test_split(trainData_X, trainData_y, test_size=0.3, random_state=123456)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 87,
   "id": "c91f3956-9570-4a82-acfe-4c319f700ea3",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(5245, 16) (2249, 16)\n"
     ]
    }
   ],
   "source": [
    "print(X_train.shape,X_test.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 88,
   "id": "b01172ff-b0e0-4561-b576-5a0c99a9bd75",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style>#sk-container-id-7 {\n",
       "  /* Definition of color scheme common for light and dark mode */\n",
       "  --sklearn-color-text: black;\n",
       "  --sklearn-color-line: gray;\n",
       "  /* Definition of color scheme for unfitted estimators */\n",
       "  --sklearn-color-unfitted-level-0: #fff5e6;\n",
       "  --sklearn-color-unfitted-level-1: #f6e4d2;\n",
       "  --sklearn-color-unfitted-level-2: #ffe0b3;\n",
       "  --sklearn-color-unfitted-level-3: chocolate;\n",
       "  /* Definition of color scheme for fitted estimators */\n",
       "  --sklearn-color-fitted-level-0: #f0f8ff;\n",
       "  --sklearn-color-fitted-level-1: #d4ebff;\n",
       "  --sklearn-color-fitted-level-2: #b3dbfd;\n",
       "  --sklearn-color-fitted-level-3: cornflowerblue;\n",
       "\n",
       "  /* Specific color for light theme */\n",
       "  --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n",
       "  --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-icon: #696969;\n",
       "\n",
       "  @media (prefers-color-scheme: dark) {\n",
       "    /* Redefinition of color scheme for dark theme */\n",
       "    --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n",
       "    --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-icon: #878787;\n",
       "  }\n",
       "}\n",
       "\n",
       "#sk-container-id-7 {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "#sk-container-id-7 pre {\n",
       "  padding: 0;\n",
       "}\n",
       "\n",
       "#sk-container-id-7 input.sk-hidden--visually {\n",
       "  border: 0;\n",
       "  clip: rect(1px 1px 1px 1px);\n",
       "  clip: rect(1px, 1px, 1px, 1px);\n",
       "  height: 1px;\n",
       "  margin: -1px;\n",
       "  overflow: hidden;\n",
       "  padding: 0;\n",
       "  position: absolute;\n",
       "  width: 1px;\n",
       "}\n",
       "\n",
       "#sk-container-id-7 div.sk-dashed-wrapped {\n",
       "  border: 1px dashed var(--sklearn-color-line);\n",
       "  margin: 0 0.4em 0.5em 0.4em;\n",
       "  box-sizing: border-box;\n",
       "  padding-bottom: 0.4em;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "#sk-container-id-7 div.sk-container {\n",
       "  /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
       "     but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
       "     so we also need the `!important` here to be able to override the\n",
       "     default hidden behavior on the sphinx rendered scikit-learn.org.\n",
       "     See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n",
       "  display: inline-block !important;\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-7 div.sk-text-repr-fallback {\n",
       "  display: none;\n",
       "}\n",
       "\n",
       "div.sk-parallel-item,\n",
       "div.sk-serial,\n",
       "div.sk-item {\n",
       "  /* draw centered vertical line to link estimators */\n",
       "  background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n",
       "  background-size: 2px 100%;\n",
       "  background-repeat: no-repeat;\n",
       "  background-position: center center;\n",
       "}\n",
       "\n",
       "/* Parallel-specific style estimator block */\n",
       "\n",
       "#sk-container-id-7 div.sk-parallel-item::after {\n",
       "  content: \"\";\n",
       "  width: 100%;\n",
       "  border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
       "  flex-grow: 1;\n",
       "}\n",
       "\n",
       "#sk-container-id-7 div.sk-parallel {\n",
       "  display: flex;\n",
       "  align-items: stretch;\n",
       "  justify-content: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-7 div.sk-parallel-item {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "}\n",
       "\n",
       "#sk-container-id-7 div.sk-parallel-item:first-child::after {\n",
       "  align-self: flex-end;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-7 div.sk-parallel-item:last-child::after {\n",
       "  align-self: flex-start;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-7 div.sk-parallel-item:only-child::after {\n",
       "  width: 0;\n",
       "}\n",
       "\n",
       "/* Serial-specific style estimator block */\n",
       "\n",
       "#sk-container-id-7 div.sk-serial {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "  align-items: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  padding-right: 1em;\n",
       "  padding-left: 1em;\n",
       "}\n",
       "\n",
       "\n",
       "/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n",
       "clickable and can be expanded/collapsed.\n",
       "- Pipeline and ColumnTransformer use this feature and define the default style\n",
       "- Estimators will overwrite some part of the style using the `sk-estimator` class\n",
       "*/\n",
       "\n",
       "/* Pipeline and ColumnTransformer style (default) */\n",
       "\n",
       "#sk-container-id-7 div.sk-toggleable {\n",
       "  /* Default theme specific background. It is overwritten whether we have a\n",
       "  specific estimator or a Pipeline/ColumnTransformer */\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "/* Toggleable label */\n",
       "#sk-container-id-7 label.sk-toggleable__label {\n",
       "  cursor: pointer;\n",
       "  display: block;\n",
       "  width: 100%;\n",
       "  margin-bottom: 0;\n",
       "  padding: 0.5em;\n",
       "  box-sizing: border-box;\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "#sk-container-id-7 label.sk-toggleable__label-arrow:before {\n",
       "  /* Arrow on the left of the label */\n",
       "  content: \"▸\";\n",
       "  float: left;\n",
       "  margin-right: 0.25em;\n",
       "  color: var(--sklearn-color-icon);\n",
       "}\n",
       "\n",
       "#sk-container-id-7 label.sk-toggleable__label-arrow:hover:before {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "/* Toggleable content - dropdown */\n",
       "\n",
       "#sk-container-id-7 div.sk-toggleable__content {\n",
       "  max-height: 0;\n",
       "  max-width: 0;\n",
       "  overflow: hidden;\n",
       "  text-align: left;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-7 div.sk-toggleable__content.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-7 div.sk-toggleable__content pre {\n",
       "  margin: 0.2em;\n",
       "  border-radius: 0.25em;\n",
       "  color: var(--sklearn-color-text);\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-7 div.sk-toggleable__content.fitted pre {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-7 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n",
       "  /* Expand drop-down */\n",
       "  max-height: 200px;\n",
       "  max-width: 100%;\n",
       "  overflow: auto;\n",
       "}\n",
       "\n",
       "#sk-container-id-7 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
       "  content: \"▾\";\n",
       "}\n",
       "\n",
       "/* Pipeline/ColumnTransformer-specific style */\n",
       "\n",
       "#sk-container-id-7 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-7 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator-specific style */\n",
       "\n",
       "/* Colorize estimator box */\n",
       "#sk-container-id-7 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-7 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-7 div.sk-label label.sk-toggleable__label,\n",
       "#sk-container-id-7 div.sk-label label {\n",
       "  /* The background is the default theme color */\n",
       "  color: var(--sklearn-color-text-on-default-background);\n",
       "}\n",
       "\n",
       "/* On hover, darken the color of the background */\n",
       "#sk-container-id-7 div.sk-label:hover label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "/* Label box, darken color on hover, fitted */\n",
       "#sk-container-id-7 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator label */\n",
       "\n",
       "#sk-container-id-7 div.sk-label label {\n",
       "  font-family: monospace;\n",
       "  font-weight: bold;\n",
       "  display: inline-block;\n",
       "  line-height: 1.2em;\n",
       "}\n",
       "\n",
       "#sk-container-id-7 div.sk-label-container {\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "/* Estimator-specific */\n",
       "#sk-container-id-7 div.sk-estimator {\n",
       "  font-family: monospace;\n",
       "  border: 1px dotted var(--sklearn-color-border-box);\n",
       "  border-radius: 0.25em;\n",
       "  box-sizing: border-box;\n",
       "  margin-bottom: 0.5em;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-7 div.sk-estimator.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "/* on hover */\n",
       "#sk-container-id-7 div.sk-estimator:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-7 div.sk-estimator.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Specification for estimator info (e.g. \"i\" and \"?\") */\n",
       "\n",
       "/* Common style for \"i\" and \"?\" */\n",
       "\n",
       ".sk-estimator-doc-link,\n",
       "a:link.sk-estimator-doc-link,\n",
       "a:visited.sk-estimator-doc-link {\n",
       "  float: right;\n",
       "  font-size: smaller;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1em;\n",
       "  height: 1em;\n",
       "  width: 1em;\n",
       "  text-decoration: none !important;\n",
       "  margin-left: 1ex;\n",
       "  /* unfitted */\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted,\n",
       "a:link.sk-estimator-doc-link.fitted,\n",
       "a:visited.sk-estimator-doc-link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "div.sk-estimator:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "/* Span, style for the box shown on hovering the info icon */\n",
       ".sk-estimator-doc-link span {\n",
       "  display: none;\n",
       "  z-index: 9999;\n",
       "  position: relative;\n",
       "  font-weight: normal;\n",
       "  right: .2ex;\n",
       "  padding: .5ex;\n",
       "  margin: .5ex;\n",
       "  width: min-content;\n",
       "  min-width: 20ex;\n",
       "  max-width: 50ex;\n",
       "  color: var(--sklearn-color-text);\n",
       "  box-shadow: 2pt 2pt 4pt #999;\n",
       "  /* unfitted */\n",
       "  background: var(--sklearn-color-unfitted-level-0);\n",
       "  border: .5pt solid var(--sklearn-color-unfitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted span {\n",
       "  /* fitted */\n",
       "  background: var(--sklearn-color-fitted-level-0);\n",
       "  border: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link:hover span {\n",
       "  display: block;\n",
       "}\n",
       "\n",
       "/* \"?\"-specific style due to the `<a>` HTML tag */\n",
       "\n",
       "#sk-container-id-7 a.estimator_doc_link {\n",
       "  float: right;\n",
       "  font-size: 1rem;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1rem;\n",
       "  height: 1rem;\n",
       "  width: 1rem;\n",
       "  text-decoration: none;\n",
       "  /* unfitted */\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "}\n",
       "\n",
       "#sk-container-id-7 a.estimator_doc_link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "#sk-container-id-7 a.estimator_doc_link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "#sk-container-id-7 a.estimator_doc_link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "</style><div id=\"sk-container-id-7\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>RandomForestClassifier()</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-7\" type=\"checkbox\" checked><label for=\"sk-estimator-id-7\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\">&nbsp;&nbsp;RandomForestClassifier<a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.4/modules/generated/sklearn.ensemble.RandomForestClassifier.html\">?<span>Documentation for RandomForestClassifier</span></a><span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></label><div class=\"sk-toggleable__content fitted\"><pre>RandomForestClassifier()</pre></div> </div></div></div></div>"
      ],
      "text/plain": [
       "RandomForestClassifier()"
      ]
     },
     "execution_count": 88,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.ensemble import RandomForestClassifier\n",
    "\n",
    "# 通过RandomForestClassifier类定义一个随机森林模型，名字叫rf\n",
    "rf = RandomForestClassifier(n_estimators = 100)\n",
    "\n",
    "# 对lr模型进行训练(fit)\n",
    "rf.fit(X_train, y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 89,
   "id": "81545814-560f-4adb-b5f8-cbd41e344c48",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>feature</th>\n",
       "      <th>importance</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>13</th>\n",
       "      <td>13</td>\n",
       "      <td>0.105650</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>15</th>\n",
       "      <td>15</td>\n",
       "      <td>0.099650</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14</th>\n",
       "      <td>14</td>\n",
       "      <td>0.082156</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>8</td>\n",
       "      <td>0.070027</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>9</td>\n",
       "      <td>0.067668</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>4</td>\n",
       "      <td>0.065572</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>7</td>\n",
       "      <td>0.063192</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "      <td>0.060882</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>10</td>\n",
       "      <td>0.060437</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>11</td>\n",
       "      <td>0.058790</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    feature  importance\n",
       "13       13    0.105650\n",
       "15       15    0.099650\n",
       "14       14    0.082156\n",
       "8         8    0.070027\n",
       "9         9    0.067668\n",
       "4         4    0.065572\n",
       "7         7    0.063192\n",
       "0         0    0.060882\n",
       "10       10    0.060437\n",
       "11       11    0.058790"
      ]
     },
     "execution_count": 89,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import pandas as pd\n",
    "features = pd.DataFrame()\n",
    "features['feature'] = X_train.columns\n",
    "features['importance'] = rf.feature_importances_\n",
    "features = features.sort_values(by =['importance'], ascending=False)\n",
    "\n",
    "# 显示最重要的前10个特征变量\n",
    "features.head(10)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 97,
   "id": "f0c74188-b7fb-40f8-af4a-e1a01c5246d5",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'criterion': 'entropy', 'max_features': 3, 'n_estimators': 30}"
      ]
     },
     "execution_count": 97,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.model_selection import GridSearchCV\n",
    "\n",
    "parameters = {\n",
    "    'n_estimators':[5,10,15,20,30],\n",
    "    'max_features':[1,2,3,4],\n",
    "    'criterion':['gini','entropy']\n",
    "}\n",
    "\n",
    "rf = RandomForestClassifier()\n",
    "rf_search = GridSearchCV(rf, parameters, scoring='accuracy', cv=5)\n",
    "rf_search.fit(X_train, y_train)\n",
    "\n",
    "#查看最佳结果\n",
    "rf_search.best_estimator_\n",
    "rf_search.best_score_\n",
    "rf_search.best_params_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 101,
   "id": "949b602b-7e8c-40f6-ba69-b4e8bf31e1d3",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style>#sk-container-id-11 {\n",
       "  /* Definition of color scheme common for light and dark mode */\n",
       "  --sklearn-color-text: black;\n",
       "  --sklearn-color-line: gray;\n",
       "  /* Definition of color scheme for unfitted estimators */\n",
       "  --sklearn-color-unfitted-level-0: #fff5e6;\n",
       "  --sklearn-color-unfitted-level-1: #f6e4d2;\n",
       "  --sklearn-color-unfitted-level-2: #ffe0b3;\n",
       "  --sklearn-color-unfitted-level-3: chocolate;\n",
       "  /* Definition of color scheme for fitted estimators */\n",
       "  --sklearn-color-fitted-level-0: #f0f8ff;\n",
       "  --sklearn-color-fitted-level-1: #d4ebff;\n",
       "  --sklearn-color-fitted-level-2: #b3dbfd;\n",
       "  --sklearn-color-fitted-level-3: cornflowerblue;\n",
       "\n",
       "  /* Specific color for light theme */\n",
       "  --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n",
       "  --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-icon: #696969;\n",
       "\n",
       "  @media (prefers-color-scheme: dark) {\n",
       "    /* Redefinition of color scheme for dark theme */\n",
       "    --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n",
       "    --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-icon: #878787;\n",
       "  }\n",
       "}\n",
       "\n",
       "#sk-container-id-11 {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "#sk-container-id-11 pre {\n",
       "  padding: 0;\n",
       "}\n",
       "\n",
       "#sk-container-id-11 input.sk-hidden--visually {\n",
       "  border: 0;\n",
       "  clip: rect(1px 1px 1px 1px);\n",
       "  clip: rect(1px, 1px, 1px, 1px);\n",
       "  height: 1px;\n",
       "  margin: -1px;\n",
       "  overflow: hidden;\n",
       "  padding: 0;\n",
       "  position: absolute;\n",
       "  width: 1px;\n",
       "}\n",
       "\n",
       "#sk-container-id-11 div.sk-dashed-wrapped {\n",
       "  border: 1px dashed var(--sklearn-color-line);\n",
       "  margin: 0 0.4em 0.5em 0.4em;\n",
       "  box-sizing: border-box;\n",
       "  padding-bottom: 0.4em;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "#sk-container-id-11 div.sk-container {\n",
       "  /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
       "     but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
       "     so we also need the `!important` here to be able to override the\n",
       "     default hidden behavior on the sphinx rendered scikit-learn.org.\n",
       "     See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n",
       "  display: inline-block !important;\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-11 div.sk-text-repr-fallback {\n",
       "  display: none;\n",
       "}\n",
       "\n",
       "div.sk-parallel-item,\n",
       "div.sk-serial,\n",
       "div.sk-item {\n",
       "  /* draw centered vertical line to link estimators */\n",
       "  background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n",
       "  background-size: 2px 100%;\n",
       "  background-repeat: no-repeat;\n",
       "  background-position: center center;\n",
       "}\n",
       "\n",
       "/* Parallel-specific style estimator block */\n",
       "\n",
       "#sk-container-id-11 div.sk-parallel-item::after {\n",
       "  content: \"\";\n",
       "  width: 100%;\n",
       "  border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
       "  flex-grow: 1;\n",
       "}\n",
       "\n",
       "#sk-container-id-11 div.sk-parallel {\n",
       "  display: flex;\n",
       "  align-items: stretch;\n",
       "  justify-content: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-11 div.sk-parallel-item {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "}\n",
       "\n",
       "#sk-container-id-11 div.sk-parallel-item:first-child::after {\n",
       "  align-self: flex-end;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-11 div.sk-parallel-item:last-child::after {\n",
       "  align-self: flex-start;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-11 div.sk-parallel-item:only-child::after {\n",
       "  width: 0;\n",
       "}\n",
       "\n",
       "/* Serial-specific style estimator block */\n",
       "\n",
       "#sk-container-id-11 div.sk-serial {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "  align-items: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  padding-right: 1em;\n",
       "  padding-left: 1em;\n",
       "}\n",
       "\n",
       "\n",
       "/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n",
       "clickable and can be expanded/collapsed.\n",
       "- Pipeline and ColumnTransformer use this feature and define the default style\n",
       "- Estimators will overwrite some part of the style using the `sk-estimator` class\n",
       "*/\n",
       "\n",
       "/* Pipeline and ColumnTransformer style (default) */\n",
       "\n",
       "#sk-container-id-11 div.sk-toggleable {\n",
       "  /* Default theme specific background. It is overwritten whether we have a\n",
       "  specific estimator or a Pipeline/ColumnTransformer */\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "/* Toggleable label */\n",
       "#sk-container-id-11 label.sk-toggleable__label {\n",
       "  cursor: pointer;\n",
       "  display: block;\n",
       "  width: 100%;\n",
       "  margin-bottom: 0;\n",
       "  padding: 0.5em;\n",
       "  box-sizing: border-box;\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "#sk-container-id-11 label.sk-toggleable__label-arrow:before {\n",
       "  /* Arrow on the left of the label */\n",
       "  content: \"▸\";\n",
       "  float: left;\n",
       "  margin-right: 0.25em;\n",
       "  color: var(--sklearn-color-icon);\n",
       "}\n",
       "\n",
       "#sk-container-id-11 label.sk-toggleable__label-arrow:hover:before {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "/* Toggleable content - dropdown */\n",
       "\n",
       "#sk-container-id-11 div.sk-toggleable__content {\n",
       "  max-height: 0;\n",
       "  max-width: 0;\n",
       "  overflow: hidden;\n",
       "  text-align: left;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-11 div.sk-toggleable__content.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-11 div.sk-toggleable__content pre {\n",
       "  margin: 0.2em;\n",
       "  border-radius: 0.25em;\n",
       "  color: var(--sklearn-color-text);\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-11 div.sk-toggleable__content.fitted pre {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-11 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n",
       "  /* Expand drop-down */\n",
       "  max-height: 200px;\n",
       "  max-width: 100%;\n",
       "  overflow: auto;\n",
       "}\n",
       "\n",
       "#sk-container-id-11 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
       "  content: \"▾\";\n",
       "}\n",
       "\n",
       "/* Pipeline/ColumnTransformer-specific style */\n",
       "\n",
       "#sk-container-id-11 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-11 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator-specific style */\n",
       "\n",
       "/* Colorize estimator box */\n",
       "#sk-container-id-11 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-11 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-11 div.sk-label label.sk-toggleable__label,\n",
       "#sk-container-id-11 div.sk-label label {\n",
       "  /* The background is the default theme color */\n",
       "  color: var(--sklearn-color-text-on-default-background);\n",
       "}\n",
       "\n",
       "/* On hover, darken the color of the background */\n",
       "#sk-container-id-11 div.sk-label:hover label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "/* Label box, darken color on hover, fitted */\n",
       "#sk-container-id-11 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator label */\n",
       "\n",
       "#sk-container-id-11 div.sk-label label {\n",
       "  font-family: monospace;\n",
       "  font-weight: bold;\n",
       "  display: inline-block;\n",
       "  line-height: 1.2em;\n",
       "}\n",
       "\n",
       "#sk-container-id-11 div.sk-label-container {\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "/* Estimator-specific */\n",
       "#sk-container-id-11 div.sk-estimator {\n",
       "  font-family: monospace;\n",
       "  border: 1px dotted var(--sklearn-color-border-box);\n",
       "  border-radius: 0.25em;\n",
       "  box-sizing: border-box;\n",
       "  margin-bottom: 0.5em;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-11 div.sk-estimator.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "/* on hover */\n",
       "#sk-container-id-11 div.sk-estimator:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-11 div.sk-estimator.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Specification for estimator info (e.g. \"i\" and \"?\") */\n",
       "\n",
       "/* Common style for \"i\" and \"?\" */\n",
       "\n",
       ".sk-estimator-doc-link,\n",
       "a:link.sk-estimator-doc-link,\n",
       "a:visited.sk-estimator-doc-link {\n",
       "  float: right;\n",
       "  font-size: smaller;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1em;\n",
       "  height: 1em;\n",
       "  width: 1em;\n",
       "  text-decoration: none !important;\n",
       "  margin-left: 1ex;\n",
       "  /* unfitted */\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted,\n",
       "a:link.sk-estimator-doc-link.fitted,\n",
       "a:visited.sk-estimator-doc-link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "div.sk-estimator:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "/* Span, style for the box shown on hovering the info icon */\n",
       ".sk-estimator-doc-link span {\n",
       "  display: none;\n",
       "  z-index: 9999;\n",
       "  position: relative;\n",
       "  font-weight: normal;\n",
       "  right: .2ex;\n",
       "  padding: .5ex;\n",
       "  margin: .5ex;\n",
       "  width: min-content;\n",
       "  min-width: 20ex;\n",
       "  max-width: 50ex;\n",
       "  color: var(--sklearn-color-text);\n",
       "  box-shadow: 2pt 2pt 4pt #999;\n",
       "  /* unfitted */\n",
       "  background: var(--sklearn-color-unfitted-level-0);\n",
       "  border: .5pt solid var(--sklearn-color-unfitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted span {\n",
       "  /* fitted */\n",
       "  background: var(--sklearn-color-fitted-level-0);\n",
       "  border: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link:hover span {\n",
       "  display: block;\n",
       "}\n",
       "\n",
       "/* \"?\"-specific style due to the `<a>` HTML tag */\n",
       "\n",
       "#sk-container-id-11 a.estimator_doc_link {\n",
       "  float: right;\n",
       "  font-size: 1rem;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1rem;\n",
       "  height: 1rem;\n",
       "  width: 1rem;\n",
       "  text-decoration: none;\n",
       "  /* unfitted */\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "}\n",
       "\n",
       "#sk-container-id-11 a.estimator_doc_link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "#sk-container-id-11 a.estimator_doc_link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "#sk-container-id-11 a.estimator_doc_link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "</style><div id=\"sk-container-id-11\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>RandomForestClassifier(max_features=3, n_estimators=30)</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-11\" type=\"checkbox\" checked><label for=\"sk-estimator-id-11\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\">&nbsp;&nbsp;RandomForestClassifier<a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.4/modules/generated/sklearn.ensemble.RandomForestClassifier.html\">?<span>Documentation for RandomForestClassifier</span></a><span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></label><div class=\"sk-toggleable__content fitted\"><pre>RandomForestClassifier(max_features=3, n_estimators=30)</pre></div> </div></div></div></div>"
      ],
      "text/plain": [
       "RandomForestClassifier(max_features=3, n_estimators=30)"
      ]
     },
     "execution_count": 101,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "rf = RandomForestClassifier(criterion='gini',max_features=3,n_estimators=30)\n",
    "rf.fit(X_train, y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 102,
   "id": "8f7053ce-25db-455e-82f5-1866d93aa4f7",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "              precision    recall  f1-score   support\n",
      "\n",
      "           0       1.00      1.00      1.00       225\n",
      "           1       0.97      0.97      0.97       234\n",
      "           2       0.96      0.98      0.97       230\n",
      "           3       0.97      0.99      0.98       246\n",
      "           4       0.99      1.00      0.99       207\n",
      "           5       0.99      0.99      0.99       228\n",
      "           6       1.00      1.00      1.00       206\n",
      "           7       0.99      0.97      0.98       227\n",
      "           8       0.99      0.99      0.99       226\n",
      "           9       0.99      0.98      0.98       220\n",
      "\n",
      "    accuracy                           0.98      2249\n",
      "   macro avg       0.98      0.98      0.98      2249\n",
      "weighted avg       0.98      0.98      0.98      2249\n",
      "\n",
      "[[224   0   0   0   0   0   0   0   0   1]\n",
      " [  0 226   6   2   0   0   0   0   0   0]\n",
      " [  0   5 225   0   0   0   0   0   0   0]\n",
      " [  0   0   1 243   0   0   0   1   0   1]\n",
      " [  0   1   0   0 206   0   0   0   0   0]\n",
      " [  0   0   0   3   0 225   0   0   0   0]\n",
      " [  0   0   0   0   1   0 205   0   0   0]\n",
      " [  0   1   2   1   0   1   0 221   1   0]\n",
      " [  0   0   0   0   0   0   0   2 224   0]\n",
      " [  0   0   0   2   1   1   0   0   1 215]]\n"
     ]
    }
   ],
   "source": [
    "from sklearn.metrics import classification_report\n",
    "from sklearn.metrics import confusion_matrix\n",
    "from sklearn.metrics import roc_curve\n",
    "from sklearn.metrics import auc\n",
    "\n",
    "# 利用模型对测试集进行预测，输出target预测标签值和概率\n",
    "y_test_pred = rf.predict(X_test)\n",
    "y_test_prob = rf.predict_proba(X_test)\n",
    "\n",
    "# 分类评估汇总报告classification_report\n",
    "print(classification_report(y_test,y_test_pred))\n",
    "# 误分类矩阵 confusion_matrix\n",
    "print(confusion_matrix(y_test,y_test_pred))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 103,
   "id": "488f561c-272e-4f2b-ad6c-e68dd538a884",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 480x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "def show_confusion_matrix(cnf_matrix, class_labels):\n",
    "    plt.matshow(cnf_matrix, cmap=plt.cm.YlGn, alpha=0.7)\n",
    "    ax = plt.gca()\n",
    "    ax.set_xlabel('Predicted Label', fontsize=16)\n",
    "    ax.set_xticks(range(0,len(class_labels)))\n",
    "    ax.set_xticklabels(class_labels,rotation=45)\n",
    "    ax.set_ylabel('Actual Label', fontsize=16, rotation=90)\n",
    "    ax.set_yticks(range(0,len(class_labels)))\n",
    "    ax.set_yticklabels(class_labels)\n",
    "    ax.xaxis.set_label_position('top')\n",
    "    ax.xaxis.tick_top()\n",
    "\n",
    "    for row in range(len(cnf_matrix)):\n",
    "        for col in range(len(cnf_matrix[row])):\n",
    "            ax.text(col, row, cnf_matrix[row][col], va='center', ha='center', fontsize=16)\n",
    "\n",
    "class_labels = [0,1]\n",
    "\n",
    "cnf_matrix = confusion_matrix(y_test, y_test_pred) \n",
    "show_confusion_matrix(cnf_matrix, class_labels)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 105,
   "id": "225f6daa-6b82-45bf-9d7c-8c1cde106f12",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 用时50分钟完成作业\n",
    "\n",
    "# git 提交修改"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "cf2548be-07ba-4132-bb0a-b85c48c0a0e0",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "e8d69f3f-8b85-4036-8076-391ced25fd0b",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
